Android事件分发总结

源码图片

viewGroup的dispatchTouchEvent

如果view实现接口onTouchListener,先走其ontouch方法,如果返回为true,不走ontouchevent,下面有具体例子

view的dispatchtouchevent

1。以我验证的布局文件为例,分析事件分发机制

log打印顺序

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父布局都拦截

textview实现ontouchlistener接口,ontouch方法返回为false

ontouch方法返回为true

linearLayout拦截并消费

第一次走拦截

拦截不消费

imageview没有添加点击事件,不会消费事件,

此时设置linearlayou3的ontouchevent返回为true,即消费事件,此后的move,up事件不会向下传递,也就是不会传递到imagview。结果如下:

如果linearlayout3设置拦截返回为true,ontouchevent返回为false,也就是拦截了但不消费事件,最后交给activity。

如果拦截并消费了,点击事件不会传递到imagview,结果如下::

你可能感兴趣的:(Android事件分发总结)