为什么写这个组件
大家应该都知道support包有个类DividerItemDecoration,但观其源码发现写的太保守,其默认使用的系统分割线样式,不能设置divider宽高、color、padding等等;IDividerItemDecoration就是为解决这些问题而存在的。
支持特性
- divider 宽高设置
- 自定义divider 颜色
- padding设置
- divider 圆角 (TODO)
实现步骤及原理
使用GradientDrawable 替换系统默认Drawable,通过此Drawable可方便设置divider颜色、宽高、padding及圆角等,GradientDrawable能干的它都能实现。
// sample code drawVertical
canvas.save();
//... 省略
if(mDividerPadding > 0){//设置了padding,调整left和right的值
left = left + mDividerPadding;
right = right - mDividerPadding;
}
mDivider.setColor(mDividerColor);//自定义color,没设置就用默认值
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, mBounds);
int bottom = mBounds.bottom + Math.round(ViewCompat.getTranslationY(child));
int top = bottom - mDivider.getIntrinsicHeight();
if(mVerticalDividerHeight > 0){//如果设置了高度,调整top的值
top = bottom - mVerticalDividerHeight;
}
mDivider.setBounds(left, top, right, bottom);
//mDivider.setCornerRadius();//设置矩形圆角
mDivider.draw(canvas);
}
canvas.restore();
结语
日常开发需求中,我们常用到应该就是divider的高度、颜色、间距的调整;此类功能简单,但能满足常规需求。写这篇文章不仅仅想说divider,而是想引出RecyclerView的内部类ItemDecoration,一个好用,功能强大,但很少用的类。