裏面咱們核心須要探索的是關於View和ViewGroup類中的如下幾個處理觸摸事件的方法的處理流程。post
ViewGoup: dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent()
View:dispatchTouchEvent(); onTouchEvent()
Activity:dispatchTouchEvent(); onTouchEvent()學習2.探索Touch事件的傳遞機制的意義
經過了解和探究Android Touch事件的傳遞機制,可讓咱們明白觸摸事件究竟是怎麼產生以及如何被處理的;spa
說明:
1.爲了便於理解和整文的清晰明瞭,本篇文章只是分析一種事件類型:ACTION_DOWN事件的傳遞過程,置於ACTION_MOVE,ACTION_UP事件會在下一篇文章《一步步探索學習Android Touch事件分發傳遞機制(二)》中分析。
2.知其然,還須知其因此然,我會在《一步步探索學習Android Touch事件分發傳遞機制(三)》中,經過分析Android源碼來解釋探索整個Android Touch事件傳遞分發機制。設計
如上圖,能夠看到,我在Activity裏面寫了三個View(ViewGroup)。ViewGroup1包裹着ViewGroup2,ViewGroup2包裹着一個TextView。這些View都是我自定義的。cdn
注:只有ViewGroup有onInterceptTouchEvent()方法。至於爲何這麼設計,在後面探索完以後會交代。對象
activity的代碼
blog
viewGroup的代碼
事件
viewGroup2的代碼
圖片
view的代碼
開發
默認狀況下,這些方法都是return super(即父類的默認實現的)。因此先看一下默認狀況下,一個ACTION_DOWN事件是怎麼傳遞的。給最裏面的View一個觸摸,產生ACTION_DOWN事件。
而後咱們探索dispatchTouchEvent()方法,令其return false(這裏以ViewGroup2的dispatchTouchEvent()方法爲例),log以下:
接着讓dispatchTouchEvent()方法return true(這裏以ViewGroup2的dispatchTouchEvent()方法爲例),log以下:
而後咱們探索一下onTouchEvent()方法,令其return false,(這裏以最裏層的View的onTouchEvent()方法爲例),log以下:
而後咱們讓onTouchEvent()方法return true,(這裏以最裏層的View的onTouchEvent()方法爲例),log以下:
最後,咱們來探索onInterceptTouchEvent()方法,令其return false,(這裏以最裏層的ViewGroup2的onInterceptTouchEvent()方法爲例),log以下:
最後,咱們讓onInterceptTouchEvent()方法return true,(這裏以最裏層的ViewGroup2的onInterceptTouchEvent()方法爲例),log以下:
1.對於dispatchTouchEvent()方法:
- return true:消費掉事件,終止傳遞。
- return false: 將事件傳遞給上一級View的onTouchEvent()方法。若是是Activity的dispatchTouchEvent()方法,則也是消費掉事件,終止傳遞。
- return super:若是是Activity,則傳給下一級view(viewGroup)的dispatchTouchEvent;若是是ViewGroup,則傳給本身的onInterceptTouchEvent();若是是View,則傳給本身的onTouchEvent().
2.對於onTouchEvent()方法:
- return true:消費掉事件,終止傳遞。
- return false/super:將事件傳遞給上一級view的onTouchEvent()方法。
3.對於onInterceptTouchEvent()方法:
- return true:將事件傳遞給ViewGroup本身的onTouchEvent()方法處理。
- return false/super:將事件傳遞給下一級View的dispatchTouchEvent()。