clipChildren与canvas的关系,导致有background属性时会遮住

来源:互联网 发布:ubuntu调出终端快捷键 编辑:程序博客网 时间:2024/06/09 14:41

费了好大的力气才把clipChildren属性为false时,当view有background属性时会遮住的问题解决掉,在这个问题解决前,还有个也是关于clipChildren属性的问题:clipChildren属性无效的解决方法,不过这个问题还好,没费多大劲,当我解决了第一个问题后,我想这回应该可以了吧,就在手机上跑了一下,突然发现有background属性和没background属性的显示有点不一样啊!没background属性的view显示在最下层,自己画的显示在中间层,有background属性的view显示在上层,当时我就纳闷了,为啥会这样???然后我就各种找原因分析,然后在网上找到了这个:Canvas的saveLayer理解,里面有一句话引起了我的注意:Layer入栈时,后续的DrawXXX操作都发生在这个Layer上,而Layer退栈时,就会把本层绘制的图像“绘制”到上层或是Canvas上,然后我就瞬间明白了,原来viewGroup在draw的时,就是一层一层的layer画在了canvers上面,因为我的view先画了,所以后面的就覆盖在了上面,于是我在网上找到了这个:getChildDrawingOrder属性的理解,就解决了这个问题。思路是如果当前draw的view是我自定义的view,那么就放到后面画,这样就在最上层啦,解决代码如下:

private int[] mDrawViews;@Overrideprotected int getChildDrawingOrder(int childCount, int i) {if(i==0){mDrawViews=new int[childCount];for(int k=0;k<childCount;k++){mDrawViews[k]=k;}}if(mDrawViews[i]==i&&(getChildAt(mDrawViews[i]) instanceof ShadowDMLayout)){for(int j=childCount-1;j>i;j--){if(!(getChildAt(j) instanceof ShadowDMLayout)){mDrawViews[i]=j;mDrawViews[j]=i;break;}}}return mDrawViews[i];}


0 0
原创粉丝点击