clipChildren與canvas的關係,導致有background屬性時會遮住

費了好大的力氣才把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;
	@Override
	protected 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];
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章