1. 程式人生 > >Android觸屏事件傳遞機制

Android觸屏事件傳遞機制

首先,需要了解:View中有兩個方法:dispatchTouchEvent,onTouchEvent

                ViewGroup中有三個方法:dispatchTouchEvent,onTouchEvent,onInterceptTouchEvent
                Activitiy中有兩個方法:dispatchTouchEvent,onTouchEvent
其中dispatchTouchEvent是用來分發Touch事件的
    onInterceptTouchEvent是用來處理是否截斷Touch事件的
    onTouchEvent是用來處理接收到的Touch事件的。
並且在Activity中還有一個onUserInteraction會在Activity的dispatchTouchEvent後被呼叫



當View中的onTouchEvent返回值為true的時候,就會處理所有傳過來的TouchEvent,並且到此結束,不會向下傳遞。
當View中的onTouchEvent返回值為false的時候,就只會處理DOWN事件,而不會處理MOVE,UP事件,並且將所有的TouchEvent向下傳遞。傳遞給ViewGroup和Activity,如果ViewGroup中的onTouchEvent返回為true時,就會處理所有的TouchEvent,若為false則只會處理DOWN事件,不會處理MOVE事件,並且將事件傳遞給Activity。

而onInterceptTouchEvent是用來表示是否截斷觸屏事件,當onInterceptTouchEvent返回值為true的時候,說明會截斷,並且將此次的TouchEvent交給該ViewGroup中的onTouchEvent來處理,但是DOWN事件都不會傳遞下去,全部交給ViewGroup的onTouchEvent來處理,如果onTouchEvent中返回false的話,就會交給下一層的ViewGroup或者Activity的onTouchEvent來處理,如果返回true的話,就會在該層ViewGroup的onTouchEvent處理所有的TouchEvent。當onInterceptTouchEvent中返回為true的時候,除了DOWN事件會經過這層的onInterceptTouchEvent方法,而MOVE,UP則不會,它們會直接交給該層的onTouchEvent方法進行處理,而不會呼叫onInterceptTouchEvent方法。

dispatchTouchEvent負責分發TouchEvent,當dispatchTouchEvent中返回為false的時候就會返回,等待下一次TouchEvent的到來,而不將TouchEvent分發出去,而當返回為true的時候,就會詢問onInterceptTouchEvent,是否攔截此TouchEvent。並且不會向下傳遞了。當Activity中的dispatchTouchEvent中返回false或者true的時候,就會只執行dispatchTouchEvent,不會將Touch事件向下傳遞,也不會給onTouchEvent進行處理。當ViewGroup中返回了false之後,則除了DOWN事件之外的其他事件也不會進入到該ViewGroup中,即接下來的MOVE,UP事件不會再經過此ViewGroup和下面的ViewGroup以及View了。而在此層的上一層進行TouchEvent的處理,如果那一層的onTouchEvent不能處理,則會給它的parentView中onTouchEvent進行處理。

總結:首先TouchEvent傳遞事件順序是:Activity的dispatchTouchEvent,如果dispatchTouchEvent返回的是true或者false,則表示不會將事件分發出去,並且等待下一次TouchEvent的到來,再進行處理。當dispatchTouchEvent的返回值為super.dispatchTouchEvent的時候,則會將Activity所接受的TouchEvent傳遞給ViewGroup,當ViewGroup中的dispatchTouchEvent返回值為true的話,則表示等待下一次TouchEvent,並且不會將TouchEvent傳遞給子ViewGroup或者View,如果返回為false或者super.dispatchTouchEvent,則會詢問該ViewGroup中的onInterceptTouchEvent,如果onInterceptTouchEvent返回為true的話,就說明截取了此次TouchEvent,給該層的onTouchEvent進行處理,如果返回為false的話,則說明不會擷取此次的TouchEvent,並且繼續向下傳遞,詢問下一層ViewGroup的dispatchTouchEvent。繼續迴圈,直到到了View的時候,如果onTouchEvent返回為true的時候,就會處理所有的TouchEvent包括DOWN,MOVE,UP,如果返回為false或者super.onTouchEvent的話,就只處理DOWN事件,而其它事件包括DOWN事件則會交給上一層的ViewGroup中的onTouchEvent進行處理。



其他參考博文:
http://orgcent.com/android-touch-event-mechanism/
 
http://www.cnblogs.com/playing/archive/2011/06/16/2082564.html
http://www.360doc.com/content/11/0221/18/15055_94878114.shtml