在郭霖大神的博客: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;}
  1. 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);}
  1. MyLayout的父类View.java中,dispatchTouchEvent方法内部,执行onTouchEvent,down事件被消费。
  2. 当move事件到来时,先进入MyLayout的dispatchTouchEvent方法中,由于target仍然为空,所以还是执行return super.dispatchTouchEvent(ev);,也就是由MyLayout直接处理move和up事件。

为什么执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了?相关推荐

  1. php 转义 回车 空格 file put content,为什么在服务器上php里执行file_put_contents创建文件返回是false呢,文件目录已经设置为777的权限了,不解...

    想用file_get_contents读取网络上的图片文件并由file_put_contesnts写入到服务器本地,file_get_contesnts执行没问题,可以读取信息,然后将读出的数据$da ...

  2. 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法

    在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他 ...

  3. java执行cmd命令,返回结果中文乱码问题解决

    java执行cmd命令,返回结果中文乱码问题解决 参考文章: (1)java执行cmd命令,返回结果中文乱码问题解决 (2)https://www.cnblogs.com/kwaitfort/p/90 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  5. python执行系统命令后获取返回值的几种方式集合

    第一种情况 os.system('ps aux') 执行系统命令,没有返回值 第二种情况 result = os.popen('ps aux') res = result.read() for lin ...

  6. python执行cmd并返回是否成功_python脚本执行CMD命令并返回结果的例子

    最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...

  7. python 调用控制台并获取返回结果_python脚本执行CMD命令并返回结果的例子

    最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...

  8. [datatable]关于在DataTable中执行DataTable.Select(“条件“)返回DataTable的解决方法

    [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 参考文章: (1)[datatable]关于在Da ...

  9. windows服务器上无法运行bat文件,Windows 2008任务计划执行bat脚本失败返回0x1的解决方法...

    测试环境: C:\>systeminfo | findstr /c:"OS Name" OS Name: Microsoft Windows Server 2008 R2 E ...

最新文章

  1. Xamarin开发Android笔记:使用ZXing进行连续扫描
  2. 【控制】《现代控制理论》谢克明老师-目录
  3. gradlew wrapper使用下载到本地的gradle.zip文件装配--转
  4. 并不是所有的 Github 项目写在简历上都加分
  5. Ansible WebUI工具之Semaphore
  6. 解决 spring-cloud-starter-zipkin 启动错误
  7. Spring Boot 2.0与Java 9
  8. web加载本地html,WKWebview加载本地html问题汇总
  9. 设计模式之单例模式——Singleton
  10. 【机器学习】监督学习--(回归)一元线性回归
  11. docker安装(一)
  12. 如何使用 淘宝 NPM 镜像
  13. Java 实战篇-JDK9新特性
  14. LINUX基本操作(实验1)
  15. win7不用破解工具,最简单的去黑屏办法
  16. 大恒相机开发实践(1)——实时采图
  17. PS混合模式图文详解
  18. ui设计和平面设计区别,平面设计好还是ui好
  19. 【C语言—零基础第九课】函数中的爱恨情仇
  20. 关于2022考研报名,这些你需要知道

热门文章

  1. Windows上WinRar命令行参数及返回值详解
  2. 新版burpsuite出现不支持HTTP2的 400 Bad Request报错
  3. 数据库时间差8小时之谜
  4. vEB Tree算法分析 von Emde Boas tree分析(草稿)
  5. html5视频播放器video player 选择
  6. 游戏出海,全球化运营
  7. 图片文字转换成文本怎么做?掌握这些小技巧就够了
  8. Scrm是什么意思 和crm系统有什么区别
  9. 【阅读笔记】Why Discard if You can Recycle?: A Recycling Max Pooling Module for 3D Point Cloud Analysis
  10. linux下swift编程教程视频教程,Ubuntu 14.04下搭建 Swift 3.0 开发环境教学视频+PPT