Android中使用itemdecoration实现时间线效果
作者:wh义华 时间:2021-10-08 12:15:49
代码如下:
// 时间线装饰器
public class TimeLineDecoration extends RecyclerView.ItemDecoration {
private Paint mPaint;
public TimeLineDecoration() {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.BLUE);
mPaint.setStrokeWidth(5);
}
@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDraw(c, parent, state);
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
// 这里的childcount为可见item的个数。 与item的个数不一定相同。
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
// 避免硬编码,这里通过代码获取在getItemOffsets方法中设置的宽度
int leftDecoWidth = layoutManager.getLeftDecorationWidth(child);
// 根据position获取当前的数据,然后根据数据状态绘制不同的形状
int position = parent.getChildAdapterPosition(child);
int cx = leftDecoWidth / 2;
int cy = child.getTop() + child.getHeight() / 2;
int radius = 20;
if (position == 2) {
c.drawRect(cx - radius, cy - radius, cx + radius, cy + radius, mPaint);
} else if (position == 4) {
// 绘制外圈为空心圆,内圈为实心圆
mPaint.setStyle(Paint.Style.STROKE);
c.drawCircle(cx, cy, radius, mPaint);
mPaint.setStyle(Paint.Style.FILL);
c.drawCircle(cx, cy, radius >> 1, mPaint);
} else {
c.drawCircle(cx, cy, radius, mPaint);
}
// 绘制item中间的连接线,第一个item与最后一个item的连接线需单独处理一下。
if (position == 0) {
c.drawLine(cx, cy + mPaint.getStrokeWidth() + radius, cx, child.getBottom(), mPaint);
} else if (position == parent.getAdapter().getItemCount() - 1) {
c.drawLine(cx, child.getTop(), cx, cy - mPaint.getStrokeWidth() - radius, mPaint);
} else {
c.drawLine(cx, cy + mPaint.getStrokeWidth() + radius, cx, child.getBottom(), mPaint);
c.drawLine(cx, child.getTop(), cx, cy - mPaint.getStrokeWidth() - radius, mPaint);
}
}
}
@Override
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDrawOver(c, parent, state);
// 不受outRect设置的范围影响,可以绘制在item上。
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
// 在item左边留下100像素的空间。 item的布局会在减掉这100像素后处理。
outRect.left = 100;
}
}
然后将该itemdecoration设置到recyclerview上。
RecyclerAdapter adapter = new RecyclerAdapter(this, data);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new TimeLineDecoration());
mRecyclerView.setAdapter(adapter);
实现效果如下:
之前在其他地方学习到,还可以通过在item layout中实现时间线的效果。
参考:
1、启舰博客。
来源:https://blog.csdn.net/honeysx/article/details/113876510
标签:itemdecoration,时间线
0
投稿
猜你喜欢
C#中登录窗体和欢迎窗体关闭方法分析
2023-03-23 03:58:25
Spring Security实现HTTP认证
2021-10-31 14:21:47
java获取json中的全部键值对实例
2023-08-23 19:53:03
Android 利用 APT 技术在编译期生成代码
2023-12-20 14:46:23
Java数据结构之AC自动机算法的实现
2023-08-31 07:23:57
Java远程连接Linux服务器并执行命令及上传文件功能
2023-01-28 14:03:31
Android 重写ViewGroup 分析onMeasure()和onLayout()方法
2023-10-27 23:58:06
Spring Security OAuth2 实现登录互踢的示例代码
2023-09-04 19:09:28
浅谈Android Studio如何Debug对应so文件C/C++代码
2023-11-20 03:23:35
浅谈Java 类中各成分加载顺序和内存中的存放位置
2022-12-23 17:24:23
C#中Predicate<T>与Func<T, bool>泛型委托的用法实例
2022-11-14 13:28:46
spring-AOP 及 AOP获取request各项参数操作
2021-11-17 19:43:34
C# AttributeUsage使用案例详解
2022-06-25 08:12:09
Java面试题冲刺第五天--基础篇2
2023-10-07 13:17:04
C#支付宝扫码支付代码完整版
2021-07-19 18:48:08
SpringCloud Eureka应用全面介绍
2022-08-23 17:43:26
Android Insets相关知识总结
2023-04-24 09:08:23
浅谈Java内存区域划分和内存分配策略
2023-08-11 18:52:49
在Java中按值调用和按引用调用
2021-12-26 20:09:21
C#委托初级使用的实例代码
2022-12-01 09:59:44