安卓事件分发机制总结

想学习自定义组件,先学习事件分发机制

看了很多事件分发机制博客,没有看源码,人家的东西总是懵懵懂懂,其实就是不懂。

感谢下面这两个链接的博主,讲解了view的事件分发(http://blog.csdn.net/guolin_blog/article/details/9097463),和viewgroup(http://blog.csdn.net/guolin_blog/article/details/9153747)的事件分发,本人才疏学浅,看了之后只非常明白view的分发机制,由于看过别人的多个viewgroup的分发,里面各种分发,截断,消费。所以不是很懂博主的viewgroup的分发,经过瞟了几行源码,觉得懂了,现在吧自己的总结帖下,错误之处,希望指正。

?

共性:点击都会调用dispatchTouchEvent

区别
一、view事件分发
dispatchTouchEvent,想看源码,如果设置了没有设置onteach监听器,就会直接调用ontachEvent方法
如果设置了onteach监听器onteach方法返回值为true,就不会调用onteachEvent,反之会调用
详情请看guolin博客

?

二、ViewGroup事件分发
ViewGroup 的dispatchTouchEvent中会调用onInterceptTouchEvent(是不是截断),

onInterceptTouchEvent如果返回false,不截断,就会遍历viewgroup的子view,找到那个子view被点击
然后调用该子view的dispatchTouchEvent方法,注意问题来了,子view也可能是viewgroup,那么就会再

次进行事件分发,原理一致
扯回来,如果截断,从源码入手
?if (mMotionTarget != null) {?
??????????? mMotionTarget = null;?
??????? }
就是说mMotionTarget 肯定为null,在截断之后
final View target = mMotionTarget;?
??? if (target == null) {?
??????? ev.setLocation(xf, yf);?
??????? if ((mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) {?
??????????? ev.setAction(MotionEvent.ACTION_CANCEL);?
??????????? mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;?
??????? }?
??????? return super.dispatchTouchEvent(ev);?
??? }
因为mMotionTarget 肯定为nul肯定为null,所以截断之后一定会调用父类的dispatchTouchEvent
因为viewgroup的父类就是view,所以就回到了第一种情况,这个时候就会去调用view中的onteah方法
也就是设置的onteach监听器的方法,所以viewgroup设置onteach监听器也就能想通了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。