android 六边形简书,六边形RecyclerView
吐槽
来个效果图吧先~
这里写图片描述
哎╮(╯▽╰)╭本月的开发项目终于在月底的时候拿到了接口,所以赶紧用迅雷掩耳不及盗铃之响叮当之势撸完了那个从Eclipse中导入的古董级项目.今天早上看到了个效果,感觉还挺有意思的,照着撸了一下,记录总结一下实现过程吧
简介
其实也没啥,这个动画效果是RecyclerView 自带的,之前一直用notifyDateSetChange(),一直没有发现,其实recyclerview很好心的自带了插入动画,调用notifyItemInserted()插入即可
自己写的也就两个部分,第一自定义Drawable ,类似自定义view吧,将图片化成六边形.第二,通过自定义LayoutManager实现按照六边形位置摆放1~7个子控件(原文是可以添加很多圈的,我就简单写写了)
public class HiveDrawable extends Drawable {
private Bitmap mBitmap;
private Paint paint;
private Path path;
private Rect rect;
public HiveDrawable(Bitmap bitmap) {
init();
if (bitmap!=null){
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
}
}
@Override
public int getIntrinsicHeight() {
if (mBitmap!=null){
return mBitmap.getHeight();
}else {
return super.getIntrinsicHeight();
}
}
@Override
public int getIntrinsicWidth() {
if (mBitmap!=null){
return mBitmap.getWidth();
}else {
return super.getIntrinsicWidth();
}
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
rect = new Rect();
rect.set(left,top,right,bottom);
int l = rect.width() / 2; //考虑横向的情况
int h = rect.height();
double v = Math.sqrt(3) / 2;
path.reset();
path.moveTo(left,h/2);
path.lineTo(left+l/2, (float) (h/2-v*l));
path.lineTo(right-l/2, (float) (h/2-v*l));
path.lineTo(right,h/2);
path.lineTo(right-l/2, (float) (h/2+v*l));
path.lineTo(left+l/2, (float) (h/2+v*l));
path.moveTo(left,h/2);
path.close();
}
private void init() {
if (paint==null){
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(3f);
}
if (path==null){
path = new Path();
}
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawPath(path,paint);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
if (paint!=null){
paint.setAlpha(alpha);
}
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
if (paint!=null)
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return 0;
}
}
自定义LayouManager
public class HiveLayoutManager extends RecyclerView.LayoutManager {
private List> positionList=new ArrayList();
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
detachAndScrapAttachedViews(recycler);
// removeAllViews();
int childCount = state.getItemCount();
View first = recycler.getViewForPosition(0);
measureChildWithMargins(first,0,0);
int left = (getWidth() - getDecoratedMeasuredWidth(first)) / 2;
int right=(getWidth() + getDecoratedMeasuredWidth(first)) / 2;
int top=(getHeight()-getDecoratedMeasuredHeight(first))/2;
int bottom=(getHeight()+getDecoratedMeasuredHeight(first))/2;
//数学计算 每一层的最后一个都为 n*n*3+3*n+1
addView(first);
layoutDecoratedWithMargins(first,left,top,right,bottom);
int num=childCount>7?7:childCount;
int cX = getWidth() / 2;
int cY = getHeight() / 2;
for (int i = 1; i
View view = recycler.getViewForPosition(i);
addView(view);
measureChildWithMargins(view,0,0);
int height = getDecoratedMeasuredHeight(view);
int width = getDecoratedMeasuredWidth(view);
double cos = Math.cos(Math.PI /3* (i - 1));
double sin = Math.sin(Math.PI /3 *(i - 1));
double viewCY = getHeight()/2-height * cos;
double viewCX = getWidth()/ 2 - height * sin;
layoutDecoratedWithMargins(view, ((int) (viewCX - width / 2)), ((int) (viewCY - height / 2))
,((int) (viewCX + width / 2)), ((int) (viewCY + height / 2)));
}
}
}
android 六边形简书,六边形RecyclerView相关推荐
- android 仿简书评论,Android仿简书搜索框效果的示例代码
前言 之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是有些要注意的东西的.话不多说,直接上图. Activity ...
- android计步器简书,自定义View-仿QQ运动步数进度效果
自定义View-仿QQ运动步数进度效果 一.写在前面 (1) 图一,仿QQ步数运行效果 (2) 图二,完整的圆效果 完整代码请看这 二.正文开始 (1)首先来个三部曲,自定义属性,布局设置,属性获取 ...
- android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容
简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...
- android jsoup简书,jsoup爬虫简书首页数据做个小Demo
昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固,比如java反射注解,知道一点就是说不出来,很尴尬... 生命不止,学习不止啊 之前那个项目 Q ...
- Android仿简书、淘宝等APP View弹出效果
在用简书App的时候觉得这个View的弹出效果特别好,而且非常平滑. 先看看效果: 主要是scale,alpha,translation几个普通动画组合,这里不再分析. 实现效果图: 代码:https ...
- android仿简书编辑器,类似zine,简书的app移动编辑器-Light Seven
原标题:类似zine,简书的app移动编辑器-Light Seven 无论你是否从事文字编辑工作,我相信每个人都会接触到文字编辑.既然接触到文字编辑,顺理成章的就会接触到文字编辑的应用和软件. 在生活 ...
- android 六边形简书,深入理解六边形架构
六边形架构或六角架构是Alistair Cockburn在2005年提出,解决了传统的分层架构所带来的问题,实际上它也是一种分层架构,只不过不是上下或左右,而是变成了内部和外部.在领域驱动设计(DDD ...
- android 心跳 简书,如何高效维持网络长连接:手把手教你实现 自适应的心跳保活机制...
前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 示意 ...
- android 购物车 简书,Android仿饿了么购物车效果
先看下效果图: ezgif-1-8f133ca916.gif 1.首先列表布局采用Recycleview android:id="@+id/container" android:l ...
- android profiler 简书,使用AndroidStudio提供的Android Profiler工具和mat进行内存泄漏分析...
废话不多说直接说流程 给项目中集成LeakCanary工具进行内存泄漏检测.发现有内存泄漏后该工具会进行提示 有内存泄露后我们需要使用as的profiler工具进行分析并获取到.hprof文件,步骤如 ...
最新文章
- fdquery update
- onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...
- 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)
- java元婴期(25)----java进阶(mybatis(4)---高级映射查询缓存)
- Java IO流之打印流与标准流
- 微软人物立方——效果还很漂亮的
- 1 用存储过程实现分页,除了上一页,下一页,第一页,和末页外还要有go按钮,以及go到那里的文本框。另外还要在Lable显示“当前x页,一共y页”。注意验证控件的使用和 链接存储过程的内容。...
- 6.java 代码块
- 【LeetCode】1. 盛最多水的容器:C#三种解法
- hibernate正向生成数据库表以及配置——Teacher.java
- 前出塞数据挖掘的一些必须了解的概念
- POJ3737 UmBasketella
- Java常用集合框架源码解析合集
- 华为模拟器路由器交换机远程控制
- 安川g7接线端子图_安川G7变频器各接线端子功能说明
- C0型单元刚度矩阵的性质
- 江苏大学计算机学院换届,关于计算机学院各支部选举结果的批复
- python-pygame小游戏之五子棋
- 谜底是计算机的谜语英语,有关英语谜语大全及答案
- Python中IO编程-文件读写
热门文章
- laaS 、paaS和SaaS区别
- 增强现实技术AR的50个应用场景
- 前端程序员兼职?不妨来试试这几个方法
- selenium元素模糊定位xpath contains、starts-with和ends-with
- HTML中的src、href
- “让我帮你百度一下”源码
- Python文件的操作
- Microsemi Libero SoC 教程2 (点亮LED闪烁)
- 研读:OASIS:On Achieving a Sanctuary for Integrity and Secrecy on Untrusted Platforms
- 【实践与问题解决38】win10桌面图标变成一个空白图标