Android事件分发原理
一、事件分发机制流程图
当点击view的时候,最先响应的是它的父容器viewGroup,执行事件分发dispatchTouchEvent(MotionEvent e),在这个方法的内部会走它自身的onInterceptTouchEvent(MotionEvent e)进行事件拦截判断,如果该方法返回值为true(进行拦截),则该事件不会传递给它的子view,会走到viewGroup的onTouchEvent(MotionEvent e)事件;如果该方法返回为false(不进行拦截),则会传递给子view,子view的dispatchTouchEvent(MotionEvent e)方法执行,因为子view没有孩子,所以它没有onInterceptTouchEvent(MotionEvent e)拦截方法,而是直接走到onTouchEvent(MotionEvent e)事件,返回true,则表明消费该事件,父容器viewGroup的onTouchEvent(MotionEvent e)不会执行;如果子view的onTouchEvent(MotionEvent e)事件返回false,则表明不消费该事件,往上抛给它的父容器viewGroup,父容器的onTouchEvent(MotionEvent e)事件会执行。以此类推,树状结果,从根部开始往下遍历,走到子view的onTouchEvent(MotionEvent e),根据它的返回结果,反馈给它的父容器。
上述流程中有关onTouch(View v, MotionEvent event)和onClick()方法进行说明:
如果View或者ViewGroup设置了View.OnTouchListener()事件,则在执行onTouchEvent(MotionEvent event)之前会执行onTouch(View v, MotionEvent event)方法,它的返回结果决定onTouchEvent(MotionEvent event)是否执行,返回false,则执行onTouchEvent(MotionEvent event);返回true,则不执行onTouchEvent(MotionEvent event)。
onClick()事件类似,前提是设置了View.OnClickListener()事件,且执行了performClick()事件,performClick()方法的执行依赖于onTouchEvent(MotionEvent event)方法的返回值,为true,则执行performClick();为false,则不执行performClick(),也就不会执行onClick()方法了。
二、View的滑动冲突
1.常见滑动冲突场景
- 外部滑动方向与内部滑动方向不一致,比如ViewPager中包含ListView
- 外部滑动方向与内部滑动方向一致,比如ScrollView中包含ListView
2.滑动冲突处理规则
通过判断是水平滑动还是竖直滑动来判断到底应该谁来拦截事件;可以根据水平和竖直两个方向的距离差或速度差来做判断。
3.滑动冲突解决方式?
- 外部拦截法: 即点击事件先经过父容器的拦截处理,如果父容器需要此事件就拦截,不需要就不拦截,需要重写父容器的onInterceptTouchEvent方法;在onInterceptTouchEvent方法中,首先ACTION_DOWN这个事件,父容器必须返回false,即不拦截ACTION_DOWN事件,因为一旦父容器拦截了ACTION_DOWN,那么后续的ACTION_MOVE/ACTION_UP都会直接交给父容器处理;其次是ACTION_MOVE,根据需求来决定是否要拦截;最后ACTION_UP事件,这里必须要返回false,在这里没有多大意义。
- 内部拦截法: 所有事件都传递给子元素,如果子元素需要就消耗掉,不需要就交给父元素处理,需要子元素配合requestDisallowInterceptTouchEvent方法才能正常工作;父元素需要默认拦截除ACTION_DOWN以外的事件,这样子元素调用parent.requestDisallowInterceptTouchEvent(false)方法时,父元素才能继续拦截需要的事件。(ACTION_DOWN事件不受requestDisallowInterceptTouchEvent方法影响,所以一旦父元素拦截ACTION_DOWN事件,那么所有元素都无法传递到子元素去)。
Android事件分发原理相关推荐
- 一张图看懂android事件分发原理
废话不多说,直接上图 图解:android中事件分发的起始点是Activity,有Activity里的Detorview通过DispatchTouchEvent开始分发,如图假设一个DOWN,MOVE ...
- 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- Android 系统(199)---Android事件分发机制详解
Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...
- 《Android深入透析》之Android事件分发机制
<Android深入透析>之Android事件分发机制 <Android深入透析>之Android事件分发机制 一. Android分发机制概述: Android如此 ...
- Android事件分发-来龙去脉
文章目录 情境(Situation) 冲突(Complication) 疑问(Question) 答案(Answer) 剖析 论点 约法三章 点 论据 人机交互 View树 类图 注释 DecorVi ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
<div id="container"> <div id="header"> <div class=&qu ...
- View的事件体系之三 android事件分发机制详解(下)
接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...
- Android 事件分发 简单学
为什么80%的码农都做不了架构师?>>> 本文地址:https://my.oschina.net/lifj/blog/1928132 Android 事件分发过程 网上有很多这 ...
- android触摸事件分发,Android 事件分发机制
Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...
最新文章
- javascript 深度克隆对象
- Spring事务原理,Java开发岗还不会这些问题
- Eclipse 浏览(Navigate)菜单
- 手写一个promise用法_手写一个自己的 JavaScript Promise 类库
- Mysql 如何做双机热备和负载均衡 (方法一)
- 为了面试能通过,我要看完这75道面试题(下)
- Spire.XLS:一款Excel处理神器(2)
- python基础编程简单案例:购买商品
- 【reverse】2021 极客大挑战(部分)
- 如何单步调试存储过程
- 测绘工程本科生如何入门GNSS算法 - 引言
- java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
- “创意云”大规模在线创作服务平台
- jQuery学习小征途
- C++ 类的静态成员及静态成员函数
- 了解JavaScript中的Promise
- 尺规虽设,犹奈“度”何
- CSV百字段Oracle建表的身不由己迫不得已解决方案——拼音
- Win10回收站清空了怎么恢复?3个简单高效的方法
- vue项目使用腾讯地图获取定位
热门文章
- MPLS之LDP协议
- 笔记本 原因代码: 0x500ff 关机类型: 关闭电源_关于笔记本电池更换的建议
- 余弦s=Acos(wt+φ)
- css规则定义的分类,CSS规则定义英汉对照表
- WPTools改进了光标定位算法和RTF编写器
- 计算机专硕_2021年北京科技大学计算机专硕考研初复试考研经验分享、择校备考分析指导...
- 【高级数理统计R语言学习】9 无序多分类分析
- 关于jupyter的故障重启(学习笔记)
- Python实现手机号自动判断男女性别
- GitLab使用手册