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 条评论

发表回复

您的电子邮箱地址不会被公开。