Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android中View的事件分發機制——Android開發藝術探索筆記

Android中View的事件分發機制——Android開發藝術探索筆記

編輯:關於android開發

Android中View的事件分發機制——Android開發藝術探索筆記


介紹

點擊事件的事件分發就是對MotionEvent事件的分發過程,當一個MotionEvent產生了以後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞的過程就是分發的過程。

涉及到的三個方法

dispatchTouchEvent:用來進行事件的分發,如果事件能夠傳遞給當前View,那麼此方法一定會被調用,返回結果受當前View的onTouchEvent和View的dispatchTouchEvent方法的影響,表示是否當消耗當前事件 onInterceptTouchEvent:用來判斷是否攔截某個事件,如果當前View攔截了某個事件,那麼在同一個事件序列當中,此方法不會被再次調用,返回結果表示是否攔截當前事件; onTouchEvent:在dispatchTouchEvent方法中調用,用來處理點擊事件,返回結果表示是否消耗當前事件,如果不消耗,則在同一個事件序列中,當前View無法再次接收到事件。

三個方法之間的關系

public boolean dispatchTouchEvent(MotionEvent ev) { 
    boolean consume = false;
    if(onInterceptTouchEvent(ev)) { 
        consume = onTouchEvent(ev);
    } else { 
        consume = child.dispatchTouchEvent(ev); 
    }
    return consume; 
}

上面的偽代碼很好的描述了三者之間的關系。如果當前View攔截事件,就交給自己的onTouchEvent去處理,否則就傳給子View,直到事件被最終處理。

事件分發順序

當一個點擊事件產生後,它的傳遞過程如下:Activity -> Window -> View。如果View的onTouchEvent返回false,那麼它的父容器onTouchEvent將會被調用,以此類推,最終將由Activity的onTouchEvent處理。

Activity對事件的分發過程

Activity -> Window -> DecorView。

Windows是一個抽象類,可以控制頂級View的外觀和行為策略,PhoneWindow是這個類的唯一個實現。
DecorView就是當前界面的底層容器,即setContentView所設置的View是它的一個子View。

頂級View對點擊事件的分發過程

ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent

頂級View一般都是一個ViewGroup。攔截事件之後,如果ViewGroup設置了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。如果onTouchEvent設置了mOnClickListener,則Listener裡的onClick會被調用。如果ViewGroup沒有攔截則傳給子View直到整個事件分發完成。

View對點擊事件的處理過程

如果View設置了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。如果onTouchEvent設置了mOnClickListener,則Listener裡的onClick會被調用。
View沒有onInterceptTouchEvent方法,一旦有點擊事件傳遞給他,他就會處理。

注:上面只是描述了事件分發過程的原理,關於源碼的分析請參考書本的相應章節。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved