代码如下:

// 时间线装饰器
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、启舰博客。

到此这篇关于Android中使用itemdecoration实现时间线效果的文章就介绍到这了,更多相关itemdecoration实现时间线内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Android中使用itemdecoration实现时间线效果的更多相关文章

  1. android – 如何使用Twitter4j获取没有用户身份验证的Twitter公共时间线?

    我写了一些代码,允许用户登录他的Twitter帐户并使用Twitter4j和thistutorial发送Tweet.现在我也可以使用公共帐户的推文但这仅在用户通过身份验证且应用程序在首选项中具有oauth令牌和机密时才有效.如何获得没有访问令牌的Twitter公共时间线,即无需用户进行身份验证?编辑我正在重新提出我的问题以使其更清楚:我设法验证我的Twitter应用程序和用户的代码为here.现在,如果用户未登录,我如何获得公共时间表?

  2. Android如何实现时间线效果

    这篇文章主要介绍了 Android如何实现时间线效果,下面文章围绕 Android如何实现时间线效果的相关资料展开详细内容,具有一定的参考价值 ,需要的朋友可以参考一下

  3. 微信小程序实现Timeline时间线效果

    这篇文章主要为大家详细介绍了微信小程序实现Timeline时间线效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. Android如何实现时间线效果(下)

    上一篇文章我们讲了Android如何实现时间线效果,今天计息上一回的文章围绕Android实现时间线效果内容展开更多,需要的朋友可以参考一下

  5. Android中使用itemdecoration实现时间线效果

    这篇文章主要介绍了Android中使用itemdecoration实现时间线效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. javascript – Twitter嵌入式时间线回调

    我一直在对Twitter的嵌入式时间表进行大量的研究.我一直在试图弄清楚是否可以知道时间线何时完成加载并显示在页面上.这个issuehasbeenrequested,但还没有实施.我来到一个死胡同,希望有人能够帮助我找到解决方案.这是我到目前为止发现的添加嵌入式时间轴的代码:当脚本运行时会发生什么:>脚本替换标记与元件.>iframe的内容已经准备好了,但头像图片和’foll

  7. cocos中如何用砖块画出LED数字

    我们可以利用精灵的移动,然后在精灵的移动过程中,通过创建时间线程,逐步创建砖块精灵,这样就达到了用砖块画出图形的目的。首先,移动是一个动作,而一个LED数字,是会拐弯的,因此,这个需要连续N个动作的连接,这个我们可以用Sequence实现。如果是一笔就可以完成的动作,那么一个时间线程就足够了,但是,有些数字,是不能一笔画出的,比如数字3。

  8. Cocosbuilder使用教程

    CocosBuilder已经被Zynga使用在游戏DreamPetHouse和ZyngaSlots开发中。在开始本文之前,确保你下载并安装了CocosBuilder的最新版并且升级cocos2d2.0或cocos2d-x的2.03版本以上。TheGame我们将创造游戏主角CocosDragon。现在我们需要建立游戏相应的CocosBuilder工程。命名为CocosDragon保存并把资源文件放到xcode的Resources文件夹打开theHelloCocosBuilder.ccb文件.我们不会使用He

  9. CocosBuilder使用总结

    但是布景层Layer的Contentsize是可以设置的。Layer的Contentsize影响触摸移动的水平、垂直推图,Layer的Contentsize即确定可以推动的尺寸。设置两个Visible关键帧来控制图片的显示时间。

  10. 在cocos2d-js 中 手动播放cocos builder 编辑的动画

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部