Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

    

    Android中觸摸事件傳遞過程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。這個是困擾初學者的問題之一,我開始也是。這裏記錄一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的處理過程,以供記憶。


    dispatchTouchEvent是處理觸摸事件分發,事件(多數情況)是從Activity的dispatchTouchEvent開始的。執行

super.dispatchTouchEvent(ev),事件向下分發。

    onInterceptTouchEventViewGroup提供的方法,默認返回false,返回true表示攔截。

    onTouchEvent是View中提供的方法,ViewGroup也有這個方法,view中不提供onInterceptTouchEvent。view中默認返回true,表示消費了這個事件。


View裏,有兩個回調函數 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev); 

ViewGroup裏,有三個回調函數 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onInterceptTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev);


在Activity裏,有兩個回調函數 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev);  


    Android中默認情況下事件傳遞是由最終的view的接收到,傳遞過程是從父佈局到子佈局,也就是從Activity到ViewGroup到View的過程,默認情況,ViewGroup起到的是透傳作用。Android中事件傳遞過程(按箭頭方向)如下圖,圖片來自[qiushuiqifei],謝謝[qiushuiqifei]整理。



  

    觸摸事件是一連串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最後ACTION_UP,觸摸事件還有ACTION_CANCEL事件。事件都是從ACTION_DOWN開始的,Activity的dispatchTouchEvent()首先接收到ACTION_DOWN,執行super.dispatchTouchEvent(ev),事件向下分發。

    dispatchTouchEvent()返回true,後續事件(ACTION_MOVE、ACTION_UP)會再傳遞,如果返回false,dispatchTouchEvent()就接收不到ACTION_UP、ACTION_MOVE。



下面的幾張圖參考自[eoe]





                                             圖1.ACTION_DOWN都沒被消費






                                

                                                                  圖2-1.ACTION_DOWN被View消費了


                                     


                                                   圖2-2.後續ACTION_MOVE和UP在不被攔截的情況下都會去找VIEW


                              

                                                                    圖3.後續的被攔截了


                              

                                                                       圖4ACTION_DOWN一開始就被攔截



android中的Touch事件都是從ACTION_DOWN開始的:

單手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP

多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.



/**
* @author 張興業
*  http://blog.csdn.net/xyz_lmn
*  android開發進階羣:281537853
*  iOS入門羣:83702688
*  我的新浪微博:@張興業TBOW
*/


發佈了272 篇原創文章 · 獲贊 72 · 訪問量 605萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章