最近在做關(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,每一幀都只繪制一次蒙層。