为什么执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了?
在郭霖大神的博客:Android事件分发机制完全解析,带你从源码的角度彻底理解(上)中有这样一句话:
如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。
准确的描述应该是这样:
如果一个子view处理了down事件,也就是返回了true。那么单链表中,会记录这个子view,后续的move和up事件都会分发给这个子view处理。如果这个子view返回false,大概率是这个子view不可点击,那么就会由别的子view或者父类的ViewGroup消费这个事件,那么单链表里面,就没有这个子view了,那么后续的move和up也就不会再派发给这个子view。所以准确的说法应该是如果某个子view,对down事件返回false,那么move和up事件就不会再派发给这个子view,而不是说move和up事件不会再执行。
举个例子:
自定义一个MyLayout继承自LinearLayout,里面放一个ImageView。点击ImageView,down事件进入ImageView的onTouchEvent方法,ImageView不可点击,返回了false. 经过一系列回传,最终由MyLayout的onTouchEvent方法处理,后续的move,up事件都不再分发给这个ImageView,直接分发给MyLayout了。
详细解释这里面的许多细节,完整源码参考郭霖大神的这两篇文章,虽然代码对应的系统版本较低。
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
具体过程如下:
1.ImageView的onTouchEvent返回false
2.ImageView的dispatchTouchEvent返回false
3. MyLayout的dispatchTouchEvent中,遍历所有子view的for循环中,if条件不成立,不会走return true;
if (child.dispatchTouchEvent(ev)) {mMotionTarget = child;return true;}
- MyLayout的dispatchTouchEvent方法内部,继续执行:
return super.dispatchTouchEvent(ev);
,其实就是View.java类中的dispatchTouchEvent方法。
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);}
- MyLayout的父类View.java中,dispatchTouchEvent方法内部,执行onTouchEvent,down事件被消费。
- 当move事件到来时,先进入MyLayout的dispatchTouchEvent方法中,由于target仍然为空,所以还是执行
return super.dispatchTouchEvent(ev);
,也就是由MyLayout直接处理move和up事件。
为什么执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了?相关推荐
- php 转义 回车 空格 file put content,为什么在服务器上php里执行file_put_contents创建文件返回是false呢,文件目录已经设置为777的权限了,不解...
想用file_get_contents读取网络上的图片文件并由file_put_contesnts写入到服务器本地,file_get_contesnts执行没问题,可以读取信息,然后将读出的数据$da ...
- 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法
在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他 ...
- java执行cmd命令,返回结果中文乱码问题解决
java执行cmd命令,返回结果中文乱码问题解决 参考文章: (1)java执行cmd命令,返回结果中文乱码问题解决 (2)https://www.cnblogs.com/kwaitfort/p/90 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...
- python执行系统命令后获取返回值的几种方式集合
第一种情况 os.system('ps aux') 执行系统命令,没有返回值 第二种情况 result = os.popen('ps aux') res = result.read() for lin ...
- python执行cmd并返回是否成功_python脚本执行CMD命令并返回结果的例子
最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...
- python 调用控制台并获取返回结果_python脚本执行CMD命令并返回结果的例子
最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...
- [datatable]关于在DataTable中执行DataTable.Select(“条件“)返回DataTable的解决方法
[datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 参考文章: (1)[datatable]关于在Da ...
- windows服务器上无法运行bat文件,Windows 2008任务计划执行bat脚本失败返回0x1的解决方法...
测试环境: C:\>systeminfo | findstr /c:"OS Name" OS Name: Microsoft Windows Server 2008 R2 E ...
最新文章
- Xamarin开发Android笔记:使用ZXing进行连续扫描
- 【控制】《现代控制理论》谢克明老师-目录
- gradlew wrapper使用下载到本地的gradle.zip文件装配--转
- 并不是所有的 Github 项目写在简历上都加分
- Ansible WebUI工具之Semaphore
- 解决 spring-cloud-starter-zipkin 启动错误
- Spring Boot 2.0与Java 9
- web加载本地html,WKWebview加载本地html问题汇总
- 设计模式之单例模式——Singleton
- 【机器学习】监督学习--(回归)一元线性回归
- docker安装(一)
- 如何使用 淘宝 NPM 镜像
- Java 实战篇-JDK9新特性
- LINUX基本操作(实验1)
- win7不用破解工具,最简单的去黑屏办法
- 大恒相机开发实践(1)——实时采图
- PS混合模式图文详解
- ui设计和平面设计区别,平面设计好还是ui好
- 【C语言—零基础第九课】函数中的爱恨情仇
- 关于2022考研报名,这些你需要知道
热门文章
- Windows上WinRar命令行参数及返回值详解
- 新版burpsuite出现不支持HTTP2的 400 Bad Request报错
- 数据库时间差8小时之谜
- vEB Tree算法分析 von Emde Boas tree分析(草稿)
- html5视频播放器video player 选择
- 游戏出海,全球化运营
- 图片文字转换成文本怎么做?掌握这些小技巧就够了
- Scrm是什么意思 和crm系统有什么区别
- 【阅读笔记】Why Discard if You can Recycle?: A Recycling Max Pooling Module for 3D Point Cloud Analysis
- linux下swift编程教程视频教程,Ubuntu 14.04下搭建 Swift 3.0 开发环境教学视频+PPT