RecyclerView.ItemDecoration 源碼分析

RecyclerView的是一個(gè)ViewGroup.會(huì)調(diào)用measureChild方法.

        public void measureChild(View child, int widthUsed, int heightUsed) {
            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
            //重點(diǎn)在這里.獲取分割線的矩形
            final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);
            //下面兩行得到分割線的寬高
            widthUsed += insets.left + insets.right;
            heightUsed += insets.top + insets.bottom;
            //child的寬高加上分割線的寬高
            final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(),
                    getPaddingLeft() + getPaddingRight() + widthUsed, lp.width,
                    canScrollHorizontally());
            final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(),
                    getPaddingTop() + getPaddingBottom() + heightUsed, lp.height,
                    canScrollVertically());
            if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) {
                child.measure(widthSpec, heightSpec);
            }
        }
Rect getItemDecorInsetsForChild(View child) {
        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
        if (!lp.mInsetsDirty) {
            return lp.mDecorInsets;
        }

        if (mState.isPreLayout() && (lp.isItemChanged() || lp.isViewInvalid())) {
            // changed/invalid items should not be updated until they are rebound.
            return lp.mDecorInsets;
        }
        final Rect insets = lp.mDecorInsets;
        insets.set(0, 0, 0, 0);
        final int decorCount = mItemDecorations.size();
        for (int i = 0; i < decorCount; i++) {
            mTempRect.set(0, 0, 0, 0);
            //我重寫的getItemOffsets方法.見下一段代碼
            mItemDecorations.get(i).getItemOffsets(mTempRect, child, this, mState);
            insets.left += mTempRect.left;
            insets.top += mTempRect.top;
            //這里就能拿到我復(fù)寫方法的的outRect.right.
            insets.right += mTempRect.right;
            insets.bottom += mTempRect.bottom;
        }
        lp.mInsetsDirty = false;
        return insets;
    }
    //比如我這樣復(fù)寫.
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,           RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //outRect的right和bottom都等于10
        outRect.right = 10;
        outRect.bottom = 10;
    }

再看RecyclerView的onDrawable方法

    @Override
    public void onDraw(Canvas c) {
        super.onDraw(c);

        final int count = mItemDecorations.size();
        for (int i = 0; i < count; i++) {
            //調(diào)用我繼承ItemDecoration重寫的onDraw方法.進(jìn)行繪制
            mItemDecorations.get(i).onDraw(c, this, mState);
        }
    }
    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(canvas, parent, state);
        int childCount = parent.getChildCount();
        drawV(canvas, parent, childCount);
        drawH(canvas, parent, childCount);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 308,455評(píng)論 27 440
  • RecyclerView 源碼分析 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。歡迎關(guān)注我的 簡(jiǎn)書 ,關(guān)注我的專題 Android ...
    MeloDev閱讀 10,280評(píng)論 6 49
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 我喪命追趕 你正當(dāng)逃竄 我馬不停蹄 你遙不可及 你我光陰大不如前 常青藤卻仍不敗不散 佛云有因有果 你我確如其言無始無終
    南希故事閱讀 238評(píng)論 4 2
  • 親愛的寶貝, 你好!一晃四年過去了,如今你已是中班的學(xué)生了!媽媽為你感到高興!還記得你剛出時(shí)媽媽看到你的第一...
    永遠(yuǎn)一樣閱讀 1,269評(píng)論 1 3

友情鏈接更多精彩內(nèi)容