ViewTreeObserver是個view事件的觀察者蜘拉。要注意的是它的初始化就是調用View.getViewTreeObserver()。
包含下面6個事件:
interface ViewTreeObserver.OnDrawListener
- 擋在一個視圖樹繪制時,所要調用的回調函數(shù)的接口類(level 16)
interface ViewTreeObserver.OnGlobalFocusChangeListener
- 當在一個視圖樹中的焦點狀態(tài)發(fā)生改變時,所要調用的回調函數(shù)的接口類
interface ViewTreeObserver.OnGlobalLayoutListener
- 當在一個視圖樹中全局布局發(fā)生改變或者視圖樹中的某個視圖的可視狀態(tài)發(fā)生改變時锨侯,所要調用的回調函數(shù)的接口類
interface ViewTreeObserver.OnPreDrawListener
- 當一個視圖樹將要繪制時,所要調用的回調函數(shù)的接口類
interface ViewTreeObserver.OnScrollChangedListener
- 當一個視圖樹中的一些組件發(fā)生滾動時早抠,所要調用的回調函數(shù)的接口類
interface ViewTreeObserver.OnTouchModeChangeListener
- 當一個視圖樹的觸摸模式發(fā)生改變時,所要調用的回調函數(shù)的接口類
具體的實例如下:
在onCreate方法中獲取控件的寬高(由于View組件布局要在onResume回調后完成撬讽,所以直接調用獲取寬高函數(shù)肯定獲取不到)
ViewTreeObserver observer = view.getViewTreeObserver();
observer .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
final int w = view.getMeasuredWidth();
final int h = view.getMeasuredHeight();
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});