如何在Android中利用itemdecoration实现一个时间线效果

今天就跟大家聊聊有关如何在Android中利用itemdecoration实现一个时间线效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

代码如下:

如何在Android中利用itemdecoration实现一个时间线效果

//时间线装饰器
publicclassTimeLineDecorationextendsRecyclerView.ItemDecoration{
privatePaintmPaint;

publicTimeLineDecoration(){
mPaint=newPaint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.BLUE);
mPaint.setStrokeWidth(5);
}

@Override
publicvoidonDraw(@NonNullCanvasc,@NonNullRecyclerViewparent,@NonNullRecyclerView.Statestate){
super.onDraw(c,parent,state);
RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager();
//这里的childcount为可见item的个数。与item的个数不一定相同。
intchildCount=parent.getChildCount();
for(inti=0;i<childCount;i++){
Viewchild=parent.getChildAt(i);
//避免硬编码,这里通过代码获取在getItemOffsets方法中设置的宽度
intleftDecoWidth=layoutManager.getLeftDecorationWidth(child);
//根据position获取当前的数据,然后根据数据状态绘制不同的形状
intposition=parent.getChildAdapterPosition(child);
intcx=leftDecoWidth/2;
intcy=child.getTop()+child.getHeight()/2;
intradius=20;
if(position==2){
c.drawRect(cx-radius,cy-radius,cx+radius,cy+radius,mPaint);
}elseif(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);
}elseif(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
publicvoidonDrawOver(@NonNullCanvasc,@NonNullRecyclerViewparent,@NonNullRecyclerView.Statestate){
super.onDrawOver(c,parent,state);
//不受outRect设置的范围影响,可以绘制在item上。
}

@Override
publicvoidgetItemOffsets(@NonNullRectoutRect,@NonNullViewview,@NonNullRecyclerViewparent,@NonNullRecyclerView.Statestate){
super.getItemOffsets(outRect,view,parent,state);
//在item左边留下100像素的空间。item的布局会在减掉这100像素后处理。
outRect.left=100;
}
}

然后将该itemdecoration设置到recyclerview上。

RecyclerAdapteradapter=newRecyclerAdapter(this,data);
mRecyclerView.setLayoutManager(newLinearLayoutManager(this));
mRecyclerView.addItemDecoration(newTimeLineDecoration());
mRecyclerView.setAdapter(adapter);

看完上述内容,你们对如何在Android中利用itemdecoration实现一个时间线效果有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。

发布于 2021-02-24 07:35:38
收藏
分享
海报
0 条评论
162
上一篇:idea中@Data标签getset不起作用如何解决 下一篇:如何在Android中实现一个动画效果的自定义下拉菜单功能
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码