ViewTreeObserver理解

ViewTreeObserver類是一個監聽View中各種狀態(焦點的改變、佈局的改變、觸摸模式的改變、繪製視圖前、滾動狀態等)。
獲得ViewTreeObserver類實例的方式:
ViewTreeObserver vto = 視圖.getViewTreeObserver();   //相應的是處理該視圖的事件。
分別實現上述狀態改變的方法:
佈局的改變:
設置visible和invisible不會回調,因爲只是看不到,但是佈局沒有變化,它還在那裏。但是設置了Gone之後就會回調
因爲佈局發生了改變。
ViewTreeObserver.OnGlobalLayoutListener listen =new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {

}
};
vto.addOnGlobalLayoutListener(listen);//添加監聽器
焦點的改變:
在inTouch模式下,在觸屏的安卓手機上,系統啓動後,一致處於inTouch模式,
處於inTouch模式,所有控件(除了EditText外)不能獲得焦點。
Button在點擊時,只是單純的執行了onClick方法,並沒有獲得焦點。
new ViewTreeObserver.OnGlobalFocusChangeListener(){

@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {

}
};
觸摸模式的改變:
在觸屏的安卓手機,系統啓動後一直處於inTouch模式,所以該方法並沒有什麼實際的意義。
new ViewTreeObserver.OnTouchModeChangeListener()
{

@Override
public void onTouchModeChanged(boolean isInTouchMode) {

}
};
繪製視圖之前:
就是在繪製本視圖之前回調的方法。
在測試中發現,無論這個view是可見還是不可見,還是GONE,其一直在回調
new ViewTreeObserver.OnPreDrawListener()
{

@Override
public boolean onPreDraw() {
return false;//返回false不會顯示該視圖,連該視圖所在的父視圖也沒有顯示。但是雖然看不到,點擊相應的位置還是有相應的事件發生。但整個view沒法顯示出來所以要設置返回true
    }
};

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