安卓事件分发机制总结
Android  /  houtizong 发布于 3年前   73
想学习自定义组件,先学习事件分发机制
看了很多事件分发机制博客,没有看源码,人家的东西总是懵懵懂懂,其实就是不懂。
感谢下面这两个链接的博主,讲解了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监听器也就能想通了。
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接