Android onInterceptTouchEvent 和 onTouchEvent

onInterceptTouchEvent方法是ViewGroup的方法,也就是全部的容器都將繼承該方法。此方法設計的意圖是爲了在父容器將touch事件傳遞給子控件的時候能夠統一控制。好比button就沒有該方法,很明顯,button不可能擁有子控件。 android

onTouchEvent方法是view的方法,當該控件接收到touch事件時,此方法會被執行。每個touch事件老是從ACTION_DOWN事件開始,ACTION_UP結束。Touchevent 中,返回值是 true ,則說明消耗掉了這個事件,返回值是 false ,則沒有消耗掉,會繼續傳遞下去 函數

Touch事件幾大原則: spa

1.若是在某個層級沒有處理ACTION_DOWN事件,那麼該層就再也收不到後續的Touch事件了直到下一次ACTION_DOWN事件。 設計

   說明:a.某個層級沒有處理某個事件指的是它以及它的子View都沒有處理該事件。 繼承

         b.這條規則不適用於Activity層(它是頂層),它們能夠收到每個Touch事件。 事件

         c.若是沒有處理ACTION_MOVE這類事件,不會有任何影響。 get

2.若是ACTION_DOWN事件發生在某個View的範圍以內,則後續的ACTION_MOVEACTION_UPACTION_CANCEL等事件都將被髮往該View,即便事件已經出界了。 it

3.第一根按下的手指觸發ACTION_DOWN事件,以後按下的手指觸發ACTION_POINTER_DOWN事件,中間起來的手指觸發ACTION_POINTER_UP事件,最後起來的手指觸發ACTION_UP事件(即便它不是觸發ACTION_DOWN事件的那根手指)。 event

4.pointer id能夠用於跟蹤手指,從按下的那個時刻起pointer id生效,直至起來的那一刻失效,這之間維持不變。 容器

5.若是一個ACTION_DOWN事件被父View攔截了,則任何子View不會再收到任何Touch事件了(這符合第1點的要求)。

6.若是一個非ACTION_DOWN事件被父View攔截了,則那些上次處理了ACTION_DOWN事件的子View會收到一個ACTION_CANCEL事件,以後不會再收到任何Touch事件了,即便父View再也不攔截後續的Touch事件。

7.若是父View決定處理Touch事件或者子View沒有處理Touch事件,則父View按照普通View的處理方式處理Touch事件,不然它根本不處理Touch事件(它只負責分發)。

8.若是父ViewonInterceptTouchEvent中攔截了事件,則onInterceptTouchEvent中不會再收到Touch事件了,事件被直接交給它本身處理(按照普通View的處理方式)。

 

從手指開始觸摸屏幕開始,首先獲得touch事件的必然是最外層的容器,此時做爲父容器,其首先觸發的是onInterceptTouchEvent,該方法提供一次能夠攔截子控件的觸摸事件的機會。一樣的返回true表示消費了該事件,此時該事件會傳遞至該容器的onTouchEvent方法。

若是返回false,那麼則繼續傳遞給在該觸摸位置的子控件(好比一個RelativeLayout),若是子控件也不處理則繼續傳遞給最後一個子控件,當最後一個子控件依然返回false,那麼該事件則冒泡傳遞給父控件,(冒泡想必寫過js的同窗很熟悉)。

 

More:

1.  一個事件必然從ACTION_DOWN開始,因此當某一個控件處理了一個ACTION_DOWN事件,能夠理解直到下一個ACTION_DOWN以前全部的觸摸事件都應當由該控件(target)進行處理。

2.  對於各類listener,顯然是由android系統進行處理的。因此Super.onTouchEvent()應當放在子類的該函數的第一行,能夠優先保證系統的方法不會被自定義的操做截取而致使沒有機會執行。

3.  牢記一個原則,全部的touch事件都是從父容器開始向下傳遞的,呈U字形

(1)  父容器(類型爲 <? Extends ViewGroup>onInterceptTouchEvent接收到事件,若是return false,轉步驟(2),不然轉 步驟(3

(2)  父容器在該位置(ACTION_DOWN發生的位置)存在子控件,若是子控件類型爲

<? Extends ViewGroup>,此時該子控件成爲父容器,轉步驟(1),若是子控件爲普通view,即 不是viewgroup的子類,使用子控件轉步驟(3),若是不存在子控件,使用父容器轉步驟(3

(3)  touch事件交給該控件的onTouchEvent進行響應,若是return false,當其存在父容器時,事件傳遞給父容器,轉步驟(3)。當不存在父容器時,該事件被丟棄。若是return true,表示事件被消費了,此touch事件終止。

相關文章
相關標籤/搜索