Android Touch事件分發傳遞

touch事件一直是Android學習者一個頭疼的問題,爲了更好的學習事件的傳遞,咱們來探索一下bash

touch事件有以下幾種:源碼分析

Activity中包括:佈局

dispatchTouchEvent
onTouchEvent學習

ViewGroup有:測試

dispatchTouchEvent
onTouchEvent
onInterceptTouchEventspa

View有:3d

dispatchTouchEvent
onTouchEvent日誌

寫一個demo,經過實踐來總結事件傳遞的方式,頁面佈局以下,咱們經過點擊view來測試touch的傳遞過程code

頁面佈局

首先,咱們自定義三個view,Group1,Group2和view,分別重寫Activity和他們的touch事件,經過點擊View打印的日誌來看view的傳遞cdn

activity代碼

activity Log截圖

viewGroup1 代碼

viewGroup1 log截圖

viewGroup2 代碼

viewGroup2 log截圖

view 代碼

view log截圖

打log,看日誌,總結規律

  • 默認狀況下,這些方法都是super(即父類的默認實現的)。因此先看一下默認狀況下,一個ACTION_DOWN和ACTION_UP事件是怎麼傳遞的。給最裏面的View一個觸摸,產生touch事件。

log

默認狀況下日誌
事件傳遞過程,能夠用以下圖來展現
紅色:ACTION_DOWN,紫色:ACTION_UP

  • 而後咱們讓dispatchTouchEvent()方法返回false(這裏在viewGroup2裏返回),log以下:
    事件傳遞過程,能夠用以下圖來展現
    紅色:ACTION_DOWN,紫色:ACTION_UP

規律:

ACTION_DOWN事件會傳遞到上一級view的onTouch()事件裏面處理。若是是在activity裏的dispatchTouch()事件返回false, 由於activity已經沒有上一級view了,因此事件會被直接消費掉(不會繼續傳遞)。
ACTION_UP事件並無按照類U型的結構去在View樹傳遞,而是直接在Activity的onTouchEvent方法中消費掉了。

  • 而後咱們讓dispatchTouchEvent()方法返回true(這裏在viewGroup2裏返回),log以下:

事件傳遞過程,能夠用以下圖來展現

紅色:ACTION_DOWN,紫色:ACTION_UP

規律:

ACTION_DOWN事件會在返回true的事件中直接消費掉,不會在繼續傳遞。
ACTION_UP事件和down事件同樣在返回true的事件中直接消費掉,不會傳遞。

  • 咱們讓onInterceptTouchEvent()方法返回false(這裏在viewGroup2裏返回),log以下

事件傳遞過程,能夠用以下圖來展現

紅色:ACTION_DOWN,紫色:ACTION_UP
規律:

ACTION_DOWN事件傳遞和返回super傳遞同樣,因此返回false和默認事件傳遞同樣。
ACTION_UP事件和默認的傳遞同樣。

  • 咱們讓onInterceptTouchEvent()方法返回true(這裏在viewGroup2裏返回),log以下

事件傳遞過程,能夠用以下圖來展現

紅色:ACTION_DOWN,紫色:ACTION_UP
規律:

ACTION_DOWN:當在onInterceptTouchEvent()返回true時,事件會傳遞到本身的onTouchEvent()中處理
ACTION_UP:事件和默認的傳遞同樣。

  • 咱們讓onTouchEvent()方法返回false(這裏在view裏返回),log以下

事件傳遞過程,能夠用以下圖來展現

紅色:ACTION_DOWN,紫色:ACTION_UP
規律:

ACTION_DOWN事件傳遞和返回super傳遞同樣,因此返回false和默認事件傳遞同樣。
ACTION_UP事件和默認的傳遞同樣。

  • 咱們讓onTouchEvent()方法返回true(這裏在view裏返回),log以下

事件傳遞過程,能夠用以下圖來展現
紅色:ACTION_DOWN,紫色:ACTION_UP
規律:

ACTION_DOWN:事件在onTouch()被消費掉,不會在繼續傳遞 ACTION_UP事件傳遞路徑和ACTION_DOWN同樣,在事件被消費掉以後不會繼續傳遞

思考總結

ACTION_DOWN:
1.返回false和默認的傳遞路基同樣。  
2.在dispatchTouchEvent()和onTouchEvent()中返回true會消費掉當前事件,不會在繼續傳遞。  
3.在onInterceptTouchEvent()中返回true,事件會直接傳遞到本身的onTouchEvent()事件中,而不會向子view傳遞。  
ACTION_UP:
1.事件返回false是傳遞路徑從當前activity的diapatchTouchEvent傳遞到本身的onTouchEvent()中。  
2.在dispatchTouchEvent()和onTouchEvent()中返回true會消費掉當前事件,不會在繼續傳遞。傳遞路徑和ACTION_DOWN路徑同樣。  
3.在onInterceptTouchEvent()中返回true,傳遞路徑和1的路徑同樣。
複製代碼

固然,總結的規律仍是要靠源碼的邏輯支撐,下一期我會上源碼分析,來支撐探究的規律

相關文章
相關標籤/搜索