安卓子view的前後關係,z軸效果更改的一些思路
阿新 • • 發佈:2019-01-25
我想了幾種解決方法:
1、將removeAllViews()移除所有子view,然後再按需要的順序add進去
2、安卓自帶了bringTofrount()可以將一個子View移動到最前, 其中的bringTofrount()只能把子view移動到最前面,不能任意改變view的前後關係, 可以不同子view多次呼叫這個方法 3、安卓5.0之後的view有一個z軸屬性,可以關注一下,4、設定兩套view其中一套是映象,也就是隻用來顯示的,根據要求進行setVisibility(INVISIBLE)或者setVisibility(VISIBLE);
著重看一下bringTofrount()這種方式
其實bringTofrount()方法是呼叫了ViewGroup中的
bringChildToFront(),繼續向父類追蹤會發現其實現原理
public void bringChildToFront(View child) { final int index = indexOfChild(child); if (index >= 0) { removeFromArray(index); addInArray(child, mChildrenCount); child.mParent = this; requestLayout(); invalidate(); } }
注意到removeFromArray(index);的實現如下
private void removeFromArray(int index) { final View[] children = mChildren; if (!(mTransitioningViews != null && mTransitioningViews.contains(children[index]))) { children[index].mParent = null; } final int count = mChildrenCount; if(index == count - 1) { children[--mChildrenCount] = null; } else if (index >= 0 && index < count) { System.arraycopy(children, index + 1, children, index, count - index - 1); children[--mChildrenCount] = null; } else { throw new IndexOutOfBoundsException(); } if (mLastTouchDownIndex == index) { mLastTouchDownTime = 0; mLastTouchDownIndex = -1; } else if (mLastTouchDownIndex > index) { mLastTouchDownIndex--; } }
其中這句final View[] children = mChildren;引用了
mChildren這個成員變數,
而該成員變數在ViewGroup中的申明是私有的,也就是說無法通過子類來進行操作
private View[] mChildren;
曾經看過有人通過反射機制呼叫安卓內部Hidden的函式,待閒餘時間再試
另外更改view的前後關係對於像幀佈局或者相對佈局一般不會打亂佈局的橫向關係,但是對於線性佈局則會完全打亂這種結構,這個必須要注意