Android View 事件傳遞

1. 基礎知識android

  1. 全部的Touch事件都被封裝成MotionEvent對象,包括Touch的位置、時間、歷史記錄以及幾個手指等。
  2. 時間類型分爲ACTION_DOWN、ACTION_UP、ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每一個事件都是以ACTION_DOWN開始ACTION_UP結束。
  3. 對事件的處理包括三類,分別爲傳遞—dispatchTouchEvent()函數、攔截—onInterceptTouchEvent()、消費—onTouchEvent()函數和onTouchListener()函數。

2. 傳遞流程git

  1. 事件從Activity.dispatchTouchEvent()開始傳遞,只要沒有中止或者被攔截,從最上層的View(ViewGroup)開始一直往下(子View)傳遞。子View能夠經過onTouchEvent()對事件進行處理。
  2. 事件由父View傳遞給子View,ViewGroup能夠經過onInterceptTouchEvent()對事件進行攔截,中止往下傳遞。
  3. 若是事件從上往下傳遞過程當中一直沒有被中止,且最底層子View沒有消費事件,事件會反向往上傳遞,這時父View(ViewGroup)能夠進行消費,若是仍是沒有被消費的話,最後會到Activity的onTouchEvent()函數。
  4. 若是View沒有對ACTION_DOWN進行消費,以後的事件也不會傳遞過來。
  5. OnTouchListener優先於onTouchEvent()對事件進行消費,上面的消費即表示函數的返回值爲True。

 

更多請直接閱讀PDF英文原文:Mastering the Android Touch Systemgithub

示例代碼:Demo@Github函數

 

附上原文兩張流程圖:spa

1. View不處理事件流程圖對象

 

 

2. View處理事件流程圖事件

 

 

我的補充:get

全部事件都會通過activity的dispatchTouchEvent()it

不管在那一層對down事件進行消費,以後的事件都不會在往下傳遞,如(結合下圖):io

1.由activity消費down事件,則以後的事件直接由activity的dispatchTouchEvent()傳遞到activity的onTouchEvent(),不會再傳遞到ViewGroup層

2.由ViewGroup消費down事件,則以後的事件都由ViewGroup的dispatchTouchEvent()傳遞到ViewGroup的onTouchEvent(),不會再傳遞到View層,也不會再通過onInterceptTouchEvent();可是Activity的dispatchTouchEvent()依然能夠接收並處理事件(固然也可攔截重發),而activity的onTouchEvent()不會接收到任何事件。

3.由View消費down事件,則以後的事件都會傳到View的onTouchEvent(),但不會傳遞到Activity和ViewGroup的onTouchEvent();Activity的dispatchTouchEvent()、ViewGroup的dispatchTouchEvent()和onInterceptTouchEvent()依然能夠接收並處理事件(固然也可攔截重發)

下面附我的繪製的簡易事件傳遞流程圖:

相關文章
相關標籤/搜索