https://www.jishudog.com/9055/html
https://blog.csdn.net/ww897532167/article/details/86187058
https://www.cnblogs.com/apkbus/p/5506301.html (***)
一、ItemDecoration的接口方法
- getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
outRect.set(50, 50, 50, 50):会转化成item左上右下的padding值
- onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
 将装饰绘制到RecyclerView提供的画布上
Google自带的DividerItemDecoration类源码分析
以竖向列表为例:
private void drawVertical(Canvas canvas, RecyclerView parent) {
        canvas.save();
        final int left;
        final int right;
        //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
    //clipToPadding用来定义ViewGroup是否允许在padding中绘制。
        if (parent.getClipToPadding()) {
            left = parent.getPaddingLeft();
            right = parent.getWidth() - parent.getPaddingRight();
            canvas.clipRect(left, parent.getPaddingTop(), right,
                    parent.getHeight() - parent.getPaddingBottom());
        } else {
            left = 0;
            right = parent.getWidth();
        }
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            parent.getDecoratedBoundsWithMargins(child, mBounds);
            final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
            final int top = bottom - mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(canvas);
        }
        canvas.restore();
    }
系统的DividerItemDecoration源码比一般的博客源码写的更加详细,考虑到了clipToPadding这个特殊的属性。
以某个position的layoutparams为基准,去绘制装饰View。
0 条评论