源码图片
如果view实现接口onTouchListener,先走其ontouch方法,如果返回为true,不走ontouchevent,下面有具体例子
1。以我验证的布局文件为例,分析事件分发机制
2.基本知识简述,TextView和ImageView等此类组件如果不添加点击事件,不会处理点击事件,Button等组件是可以处理点击事件,也就是onTouchEvent方法返回为true。DecorView为Activity的根View,继承FramLayout,有onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent方法,Activity有onTouchEvent,dispatchTouchEvent方法,View类的控件有dispatchTouchEvent,onTouchEvent。
3.验证过程。点击textview“北京”,textview没有添加点击事件,不会消费事件,传递过程为,
从Acitivity的dispatchTouchEvent方法依次分发给跟布局的dispatchTouchEvent方法,在根viewgroup中有拦截方法,调用拦截,不拦截分发给子view,子view没有拦截方法,直接ontouchevent方法消费,不消费,向上分发,linearlayout和textview都不消费,只能交给activity,从结果看出activity也没有消费。
textview加clickble属性为true或者代码添加点击事件
textview实现ontouchlistener接口,ontouch方法返回为false
ontouch方法返回为true
linearLayout拦截并消费
拦截不消费
imageview没有添加点击事件,不会消费事件,
此时设置linearlayou3的ontouchevent返回为true,即消费事件,此后的move,up事件不会向下传递,也就是不会传递到imagview。结果如下:
如果linearlayout3设置拦截返回为true,ontouchevent返回为false,也就是拦截了但不消费事件,最后交给activity。
如果拦截并消费了,点击事件不会传递到imagview,结果如下::