View事件分发机制分析
谈到View事件分发,相信大家都不陌生,我也自己琢磨了一下事件分发机制,从源码分析,提取了关键的步骤,并做小小的总结。
主要相关的类与方法为:
ViewGroup:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
View:
dispatchTouchEvent()
onTouchEvent()
整体的思想可以概括为:
public boolean dispatchTouchEvent(){boolean consume = false;if(onInterceptTouchEvent()){cousume = onTouchEvent();}else{consume = child.dispatchTouchEvent();}return consume;
}
先看整体流程图:
修正补充@2016年6月27日:
经@wangmengdeboke 的指出,左下角部分的图需要做点改动,如下图所示:
正如补充的,这个disable状态也是蛮重要的,非常感谢@wangmengdeboke的指正。
- activity事件分发
在图的左上角,是activity的事件分发,实际是调用DecorView的dispatchTouchEvent来进行的,而DecorView是继承自FrameLayout的类,其实算是最外层的viewGroup,当事件传递到viewGroup,就进入到右边分支判断。 - ViewGroup的事件分发
一般情况下,如果不对onInterceptTouchEvent与disallowIntercept进行处理,就会对viewGroup中的childView进行处理,所以这里可以通过人为干预达到拦截事件分发的效果,但值得注意的是不能够拦截down事件,因为一旦拦截,则在onInterceptTouchEvent中不会接收到up与move事件,即这些事件直接被该viewGroup处理了。 - View的事件分发
当事件分发到view后,会按序执行onTouch,onTouchEvent,onClick【如果有的话】,一旦有一者返回true消耗掉事件,则后者都不会响应,这里的onTouchEvent,适合做相关的事件处理与执行工作。
总结:
每个手指的动作,都会触发down,up,move的操作,并引发一系列的事件分发,而且一旦拦截掉down,则所有的事件也会交由该控件处理。在自定义viewGroup与View中,我们可以在onTouchEvent里面对相关的手指动作做处理,而在ViewGroup中,可以根据需要在onInterceptTouchEvent拦截该拦截需要拦截的事件。在View中,也可以修改父容器disallowInterceptTouchEvent的值达到控制父容器事件分发的目的,不过需要注意的是,down事件一定注意不要被父容器拦截到。
View事件分发机制分析相关推荐
- View事件分发机制(源码分析篇)
01.Android中事件分发顺序 1.1 事件分发的对象是谁 事件分发的对象是事件.注意,事件分发是向下传递的,也就是父到子的顺序. 当用户触摸屏幕时(View或ViewGroup派生的控件),将产 ...
- Android 事件分发机制分析及源码详解
Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...
- Android面试老生常谈的 View 事件分发机制,看这一篇就够了
本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 在 Android 开发当中,View 的事件分发机制是一块很重 ...
- Android View 事件分发机制详解
想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...
- 一文读懂Android View事件分发机制
Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...
- View事件分发机制(源码 API27)
1.什么是事件分发机制 当用户触摸屏幕时,会产生一个touch事件,这个touch事件(motionEvent)传递到某个具体的view处理的整个过程 用户触摸屏幕会产生一个事件流(ACTION_DO ...
- 【Android View事件分发机制】关于拦截事件的注意点
在父容器拦截事件时,为什么不能拦截DOWN事件呢? 先看看源码: 回顾一下事件分发机制原理,当事件来了之后,如果父容器不拦截,则会询问其child view ,当某child view 有事件需求,父 ...
- View事件分发机制
一.概念 View可以说是Android中的第五大控件了,不管是Button还是TextView还是复杂的RelativeView,他们的共同基类都是View,View是界面层控件的一种抽象,View ...
- View 事件分发机制
View 中的事件消息传递,是android的一个重点和难点,我们只有掌握了它,才能更好的理解view,写出自己比较满意的自定义控件,解决控件嵌套时产生的滑动冲突和点击事件失效问题. 我们知道 Vie ...
- 【Android View事件分发机制】滑动冲突
View内容滑动概念 scrollTo scrollBy scrollTo(x,y) x,y 是绝对值,如果x,y不变,重复调用是不会移动的. scrollBy(x,y) x,y是增量之,每次调用都会 ...
最新文章
- hashmap::begin() 坑
- Java数据库查询简介
- Unity 编译apk启动出异常
- C库宏-offsetof()
- web 资源管理器相关产品
- selenium 使用js执行脚本儿链接整理
- 基于比较的排序算法集
- 解决异常:公共语言运行时检测到无效的程序
- 计算机829大纲,829计算机基础考试大纲
- 微信小程序商城模板平台分享
- OSEK网络管理入门
- 简单好用的Mac截图工具:FinalShot
- 手把手教你:基于深度学习的滚动轴承故障诊断
- 谷歌浏览器扩展程序XDM_这才是谷歌浏览器的正确打开方式,有效节省内存占用,流畅飞起...
- 移动端图片居多,加载过慢,使用延迟加载|懒加载( lazyload.js)
- 计算机可以调剂到资源与环境吗,资源与环境求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
- Oracle数据库账号密码设置
- 学习笔记:测试抓包工具fiddler
- 单例模式及单例类的两种实现
- centos7上mycat安装_centos7 Mycat/MySQL/MariaDB安装部署