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裡,有兩個回撥函式 :
- publicboolean dispatchTouchEvent(MotionEvent ev);
- publicboolean onTouchEvent(MotionEvent ev);
ViewGroup裡,有三個回撥函式 :
- publicboolean dispatchTouchEvent(MotionEvent ev);
- publicboolean onInterceptTouchEvent(MotionEvent ev);
-
publicboolean onTouchEvent(MotionEvent ev);
- publicboolean dispatchTouchEvent(MotionEvent ev);
- 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()返回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.