DrawerLayout多Child導(dǎo)致陰影顏色不一

最近在做關(guān)于DrawerLayout的需求,發(fā)現(xiàn)當(dāng)非Drawer的Child多于一個時,把Drawer拉出來產(chǎn)生的遮罩顏色不一,如下圖


image.png

查看了DrawerLayout的源碼,感覺出現(xiàn)陰影顏色不一致問題的原因是源碼設(shè)計有點缺陷?

DrawerLayout常見的用法是設(shè)置兩個View,一個作為抽屜,一個作為主View,這種情況下抽屜出來時主View上的陰影沒有問題。但是,當(dāng)主View不止一個時,例如下圖,兩個View同級寫在DrawerLayout中,這時候抽屜出來時陰影就會出現(xiàn)問題。

image.png

查看DrawerLayout的drawChild方法,發(fā)現(xiàn)陰影的繪制是下面的邏輯,每次調(diào)用drawChild時,只要當(dāng)前在繪制的是主View,就繪制一次全屏的陰影:

@Override
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        final boolean drawingContent = isContentView(child);//contentView就是上面說的主view
        ...
        if (mScrimOpacity > 0 && drawingContent) {
            canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint);//繪制全屏的陰影
        }
       ...
    }

DrawerLayout中判斷一個Child是否主View的方法就是看它有沒有設(shè)置gravity屬性,沒設(shè)置就是主view

boolean isContentView(View child) {
    return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY;
}

按照源碼的方式去繪制,當(dāng)有兩個主View時,繪制一幀的圖層是這樣的:

繪制主View1 —> 繪制蒙層 —> 繪制主View2 —> 繪制蒙層

當(dāng)最先繪制的主View1沒有被主View2擋住時,可以看到它的上面是有兩層陰影疊加的效果,因此,會呈現(xiàn)出一深一淺的效果。

找到了原因,解決方法就有了,想辦法保證只有一個主View!

或者讓Google大佬改改,無論有幾個主View,每一幀都只繪制一次蒙層。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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