查看: 2431|回复: 0

[Android教程] RecyclerView分隔线定制

发表于 2018-1-11 08:00:00

分割线我们利用RecyclerView的addItemDecoration(ItemDecoration fromHtml) 新建一个类来看看到底是什么:

  1. public class CategoryItemDecoration extends RecyclerView.ItemDecoration {
  2. @Override
  3. public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
  4. }
  5. @Override
  6. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  7. }
  8. }
复制代码

有两个方法getItemOffsets()这里我一般指定偏移量就可以了,就是分割线占多少高度,或者说是画在什么位置,你总的给我留出位置来;onDraw()我们可以直接去绘制,绘制什么都可以因为有Canvas ,但一般都是绘制Drawable。

  1. public class CategoryItemDecoration extends RecyclerView.ItemDecoration {
  2. private Paint mPaint;
  3. public CategoryItemDecoration(int color) {
  4. // 直接绘制颜色 只是用来测试
  5. mPaint = new Paint();
  6. mPaint.setColor(color);
  7. mPaint.setAntiAlias(true);
  8. }
  9. @Override
  10. public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
  11. int childCount = parent.getChildCount();
  12. // 获取需要绘制的区域
  13. Rect rect = new Rect();
  14. rect.left = parent.getPaddingLeft();
  15. rect.right = parent.getWidth() - parent.getPaddingRight();
  16. for (int i = 0; i < childCount; i++) {
  17. View childView = parent.getChildAt(i);
  18. rect.top = childView.getBottom();
  19. rect.bottom = rect.top + 20;
  20. // 直接利用Canvas去绘制一个矩形 在留出来的地方
  21. c.drawRect(rect, mPaint);
  22. }
  23. }
  24. @Override
  25. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  26. // 在每个子View的下面留出20px来画分割线
  27. outRect.bottom += 20;
  28. }
  29. }
复制代码

2.RecyclerView源码解析 - 分割线

猜想: 既然考虑了分割线,那么子View在测量时候肯定要去考虑分割线留出的位置 直接measureChild()方法

猜想: 分割线会调用绘制的方法 onDraw()



回复

使用道具 举报