一類的基本概念
這是一個註冊監聽視圖樹的觀察者(observer),在視圖樹種全域事件改變時得到通知。這個全域事件不僅還包括整個樹的布局,從繪畫過程開始,觸摸模式的改變等。最常見的用途時通過監聽獲知什麼時候,視圖的寬高值確定了,可以擷取了,以便更改UI。
二類的主要介面:監聽器
interface ViewTreeObserver.OnGlobalFocusChangeListener 當在一個視圖樹中的焦點狀態發生改變時,所要調用的回呼函數的介面類
interface ViewTreeObserver.OnGlobalLayoutListener當在一個視圖樹中全域布局發生改變或者視圖樹中的某個視圖的可視狀態發生改變時,所要調用的回呼函數的介面類
interface ViewTreeObserver.OnPreDrawListener當一個視圖樹將要繪製時,所要調用的回呼函數的介面類
interface ViewTreeObserver.OnScrollChangedListener當一個視圖樹中的一些組件發生滾動時,所要調用的回呼函數的介面類
interface ViewTreeObserver.OnTouchModeChangeListener當一個視圖樹的觸摸模式發生改變時,所要調用的回呼函數的介面類三程式碼範例
1.建立監聽器
private final ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int width = -1; int height = -1; try { width = getActivity().getWindow().getDecorView().getWidth(); height = getActivity().getWindow().getDecorView().getHeight(); } catch (Exception e) { // called too early. so, just skip. } if (width != -1 && mGlobalLayoutWidth != width) {//只有當尺寸真正有了數值,即已經確定了,更新UI才有意義 mGlobalLayoutWidth = width; updateUI(); } else if (height != -1 && mGlobalLayoutHeight != height) { mGlobalLayoutHeight = height; updateUI(); } } };
2.一般在onCreate或者onCreateView中註冊監聽器
mViewTreeObserver = getActivity().getWindow().getDecorView().getViewTreeObserver(); mViewTreeObserver.addOnGlobalLayoutListener(mGlobalLayoutListener);