1. 程式人生 > >Android 觸控事件傳遞流程解析

Android 觸控事件傳遞流程解析

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

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

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

解釋:

dispatchTouchEvent是處理觸控事件分發,事件(多數情況)是從Activity的dispatchTouchEvent開始的。執行
super.dispatchTouchEvent(ev),事件向下分發。
onInterceptTouchEvent是ViewGroup提供的方法,預設返回false,返回true表示攔截。
onTouchEvent是View中提供的方法,ViewGroup也有這個方法,view中不提供onInterceptTouchEvent。view中預設返回true,表示消費了這個事件。

View裡,有兩個回撥函式 :

  1. publicboolean dispatchTouchEvent(MotionEvent ev);    
  2. publicboolean onTouchEvent(MotionEvent ev);   

ViewGroup裡,有三個回撥函式 :

  1. publicboolean dispatchTouchEvent(MotionEvent ev);    
  2. publicboolean onInterceptTouchEvent(MotionEvent ev);    
  3. publicboolean onTouchEvent(MotionEvent ev);  
在Activity裡,有兩個回撥函式 :
  1. publicboolean dispatchTouchEvent(MotionEvent ev);    
  2. publicboolean 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.後續的被攔截了

                              

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

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

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