Touch事件分發(fā)理解

  1. Touch事件分發(fā)中只有兩個主角:ViewGroup和View。
    ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關(guān)事件。
    View包含dispatchTouchEvent、onTouchEvent兩個相關(guān)事件。

  2. ViewGroup和View組成了一個樹狀結(jié)構(gòu),根節(jié)點為Activity內(nèi)部包含的一個ViwGroup。

  3. 觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個,Move有若干個,可以為0個。

  4. 當(dāng)Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發(fā)。ViewGroup的遍歷(深度優(yōu)先遍歷)可以看成是遞歸的。分發(fā)(dispatchTouchEvent)的目的是為了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchuEvent結(jié)果返回true。
    ViewGroup的dispatchTouchEvent是真正在執(zhí)行“分發(fā)”工作,它擁有boolean類型的返回值,當(dāng)返回為true時,順序下發(fā)會中斷。而View的dispatchTouchEvent方法,并不執(zhí)行分發(fā)工作,或者說它分發(fā)的對象就是自己,決定是否把touch事件交給自己處理,而處理的方法,便是onTouchEvent事件,事實上子View的dispatchTouchEvent方法真正執(zhí)行的代碼是這樣的

   public boolean dispatchTouchEvent(MotionEvent ev){
        ....//其他處理,在此不管
        return onTouchEvent(event);
    }

所以對于View,我們 更關(guān)心它的onTouchEvent,而不會去認為的設(shè)置View的dispatchTouchEvent返回true,我們可以通過在onTouchEvent消費事件的方式來阻止事件的進一步下發(fā)。

5.ViewGroup在dispatchTouchEvent后,還會經(jīng)歷一個onInterceptTouchEvent方法,假如我們在某個ViewGroup的onInterceptTouchEvent中,將Action為Down的Touch事件返回true,那便表示將該ViewGroup的所有下發(fā)操作攔截掉。

我們編程過程中,對于ViewGroup,事件來說,我們更多的是關(guān)注他的事件分發(fā)過程,如果在dispatchTouchEvent過程,或是onInterceptTouchEvent返回值為true,代表事件被攔截了,不在下發(fā),只有其自身和其父親組件有權(quán)利消費該事件。這時候,我們就更關(guān)心其onTouchEvent事件對Touch的處理了。
對于View來說,我們更關(guān)心的是它的onTouchEvent方法,因為其dispatchTouchEvent方法,實際上也是執(zhí)行了onTouchEvent方法。我們可以通過onTouchEvent來控制View是否消費事件,從而達到控件事件是否繼續(xù)分發(fā)。ps:事件被消費了后,就不會分發(fā)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容