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代碼
viewGroup1 代碼
viewGroup2 代碼
view 代碼
打log,看日誌,總結規律
log
規律:
ACTION_DOWN事件會傳遞到上一級view的onTouch()事件裏面處理。若是是在activity裏的dispatchTouch()事件返回false, 由於activity已經沒有上一級view了,因此事件會被直接消費掉(不會繼續傳遞)。
ACTION_UP事件並無按照類U型的結構去在View樹傳遞,而是直接在Activity的onTouchEvent方法中消費掉了。
規律:
ACTION_DOWN事件會在返回true的事件中直接消費掉,不會在繼續傳遞。
ACTION_UP事件和down事件同樣在返回true的事件中直接消費掉,不會傳遞。
ACTION_DOWN事件傳遞和返回super傳遞同樣,因此返回false和默認事件傳遞同樣。
ACTION_UP事件和默認的傳遞同樣。
ACTION_DOWN:當在onInterceptTouchEvent()返回true時,事件會傳遞到本身的onTouchEvent()中處理
ACTION_UP:事件和默認的傳遞同樣。
ACTION_DOWN事件傳遞和返回super傳遞同樣,因此返回false和默認事件傳遞同樣。
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的路徑同樣。
複製代碼
固然,總結的規律仍是要靠源碼的邏輯支撐,下一期我會上源碼分析,來支撐探究的規律