View分發筆記

大大大大大發表於2019-08-12

一、分發順序(從ViewGroup開始算)

1、dispatchTouchEvent( ) -> onInterceptTouchEvent( ) -> onTouchEvent( )

二、事件分發可能性

1、所有的viewgroup、view的onTouchEvent()方法都沒有返回true,即當前事件沒有被消費。在分發完 ACTION_DOWN 事件之後的事件不會再分發下來。應該是都沒有處理這個事件,所以被頂層Activity(或Window?)處理了,之後的事件序列都被攔截),滑動一下下面的MyView,得出以下結果

View分發筆記

08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup_01 dispatchTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup_01 onInterceptTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup02 dispatchTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup02 onInterceptTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup03 dispatchTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup03 onInterceptTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: MyView dispatchTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: MyView onTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup03 onTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup02 onTouchEvent MotionEvent.ACTION_DOWN  
08-12 07:26:27.895 6076-6076/com.dgz.kttest E/test2: ViewGroup_01 onTouchEvent MotionEvent.ACTION_DOWN
複製程式碼

雖然有滑動的動作,但是除了Down事件,其他的完全沒有分發到這幾個View。

2、如果ViewGroup在onInterceptTouchEvent()中返回true攔截了事件,該事件將不會再向下分發。如果該事件沒有被消費,即沒有哪個View或者ViewGroup的onTouch()方法返回true,又會像上面的情況一樣。

2、如果ViewGroup在onInterceptTouchEvent()中返回true攔截了事件,並且消費,則後續的事件執行了dispatchTouchEvent()之後直接執行該ViewGroup的onTouchEvent(),不會再執行如果ViewGroup在onInterceptTouchEvent()。

三、小結

1、dispatchTouchEvent():View和Event第一次接觸

2、onInterceptTouchEvent():判斷event是否應該分發下去。返回true表示攔截了,不分發。返回false表示不攔截,分發

3、onTouchEvent():判斷是否消費這個事件,如果Action_Down事件不消費,普通的View不能再獲取到剩下的事件。ViewGroup可以在onInterceptTouchEvent()中攔截本應該發給子view的事件。(像個偷東西的賊。。)

四、總結

文章真難寫,完全沒法把自己的理解通過文字表達出來。

參考:可能是講解Android事件分發最好的文章

相關文章