View分发笔记

253 阅读2分钟

一、分发顺序(从ViewGroup开始算)

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

二、事件分发可能性

1、所有的viewgroup、view的onTouchEvent()方法都没有返回true,即当前事件没有被消费。在分发完 ACTION_DOWN 事件之后的事件不会再分发下来。应该是都没有处理这个事件,所以被顶层Activity(或Window?)处理了,之后的事件序列都被拦截),滑动一下下面的MyView,得出以下结果

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事件分发最好的文章