對手勢分發機制的一些理解
參考資料:
ViewGroup 的 onDispatchTouchEvent() 負責對手勢的分發,當 onDispatchTouchEvent 方法返回false的時候,事件分發被攔截,從該ViewGroup開始在這之後的子View將不會接收到對事件處理的通知,onTouchEvent將會由上層ViewGroup或者Activity執行。(但是子View的ACTION_DOWN事件還是會執行)返回true的意思即分發事件被消費,那麼viewGroup的onTouchevent方法將不會被呼叫。將會呼叫子View的onTouchEvent。
而子view的ondispatchTouchEvent方法並不執行分發物件,其執行的物件就是他自己,它的返回值是return onTouchEvent()。如果return true則表示改TouchEvent會被消費,即會執行ACTION_MOVE/UP事件。
當所有的子view都返回false時,viewgroup就會執行其自身的onTouchEvent 方法。(因為當子view返回false的時候,將會上傳給parent的viewgroup的onTouchEvent方法,如果ViewGroup不處理,將會一直上傳到Activity。)隧道式下發,冒泡式上傳。
onInterceptTouchEVent返回true 時 ,攔截正在執行的手勢,將由執行該方法的viewgroup的onTouchEvent方法執行Action一系列動作。此時子view將會收到一個Action_Cancel的狀態,並在狀態中處理(其ACTION_DOWN/MOVE/UP方法將不會被執行)。如果onInterceptTouchEvent返回true,則子view的ACTION_DOWN方法也不會執行,即手勢被攔截,只會執行viewgroup的onTouchEvent。
如有錯誤歡迎指正,本文也是對應文章開頭參考程式碼測試得出的個人見解。