首页 > 移动平台 > 详细

安卓事件分发机制总结

时间:2015-05-30 02:05:56      阅读:351      评论:0      收藏:0      [点我收藏+]

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

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

感谢下面这两个链接的博主,讲解了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监听器也就能想通了。

安卓事件分发机制总结

原文:http://376798041.iteye.com/blog/2215554

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!