Android 编程下 Touch 事件的分发和消费机制
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。方法与控件的对应关系如下表所示:
Touch 事件相关方法 |
方法功能 |
ViewGroup |
View |
Activity |
public boolean dispatchTouchEvent(MotionEvent ev) | 事件分发 | Yes | Yes | Yes |
public boolean onInterceptTouchEvent(MotionEvent ev) | 事件拦截 | Yes | Yes | No |
public boolean onTouchEvent(MotionEvent ev) | 事件响应 | Yes | Yes | Yes |
从这张表中我们可以看到 ViewGroup 和 View 对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。另外需要注意的是 View 对 dispatchTouchEvent(MotionEvent ev) 和onInterceptTouchEvent(MotionEvent ev) 的响应的前提是可以向该 View 中添加子 View,如果当前的 View 已经是一个最小的单元 View(比如 TextView),那么就无法向这个最小 View 中添加子 View,也就无法向子 View 进行事件的分发和拦截,所以它没有dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev),只有 onTouchEvent(MotionEvent ev)。
一、Touch 事件分析
▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下:
- 如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
- 如果 return false,事件分发分为两种情况:
- 如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
- 如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
- 如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:
- 如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
- 如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
- 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:
- 如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
- 如果返回了 true 则会接收并消费该事件。
- 如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
转载于:https://www.cnblogs.com/denghaicheng/p/4917761.html
Android 编程下 Touch 事件的分发和消费机制相关推荐
- Android 系统(74)---Android手势触摸事件的分发和消费机制
Android手势&触摸事件的分发和消费机制 在Android 客户端开发过程中,经常会遇到手势事件的处理,本篇博文讲一下本人对touch事件处理机制的一些理解,希望对一些初级开发者有所帮助. ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315),请尊重他人的辛勤劳动成果,谢谢! 今天这篇 ...
- Android 编程下代码之(QQ消息列表滑动删除)
这份代码写出来有些时候了,一直没共享,现在把它共享给大家.简单列一下代码中你可以学到的知识点: 自定义控件的实现方式: 事件的拦截分发消费机制: QQ会话列表滑动删除原理: 最后附上源码链接:Q ...
- Android 编程下通知的发送
通知的发送一般是在手机接收到信息或是手机在后台的一项操作完成时用于提示用户的一条信息,通知的实现分为以下三步: 创建通知管理器(NotificationManager) 创建通知(Notificati ...
- Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错
使用了极光推送的 jar 包项目在从 SVN 中检出后,如果不重新对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jpu ...
- Android 编程下帧动画在 Activity 启动时自动运行的几种方式
Android 开发过程中部分 Activity 在显示的时候就要求给用户显示一个进度框来改善用户体验,比如:Activity 在启动的时候就去联网请求数据.读取数据库内容等.进度框显示样式如下,采用 ...
- Android 编程下快捷图标的创建
创建快捷图标的方式 在 Launcher 界面手工添加快捷图标 通过代码向 Launcher 中的广播接收者发送广播来创建快捷图标 创建快捷图标的原理 采用了 Android 系统的广播机制,发送一个 ...
- Android 编程下 AlarmManager
对应 AlarmManager 有一个 AlarmManagerServie 服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册的各类闹铃并适时的设置即将触发的闹铃给闹铃设备 ( 在系 ...
最新文章
- 至强® 平台配备先进遥测技术让您的数据中心更智能
- 【组队学习】【32期】算法的应用
- ubuntu18.04在终端安装pip3时404 Not Found [IP: 91.189.91.24 80]_木绿的博客-CSDN博客
- 关于MFC的CString 访问越界问题
- nofollow标签_nofollow标签在网站中的运用
- Exchange企业实战技巧(27)邮件中使用数字签名和邮件加密功能
- MiniDao持久层 Vs Mybatis
- SRM 625 DIV2
- css easyui,对比easyui和jwwui css
- ubuntu lamp环境(阿里云搭建lamp)
- Python数据处理之导入导出excel数据
- python课程设计实验报告-python课程设计
- UOS/deepin上安装坚果云
- 对话深喉:中小App如何突围?(开发者必看)
- 蓝鲸智云平台部署[6.0.5]
- matlab里面sin函数是角度,matlab-如何用matlab编写sin函数要求定义一 – 手机爱问
- 如何安装 Manjaro 21 桌面系统 ?
- Excel-VBA操作文件四大方法之一(转)
- C++学习之路二:C++
- SAP成都研究院小伙伴们2018~2019两年间的179篇原创文章合集
热门文章
- 【HRBUST - 1054 】Brackets! Brackets! (括号匹配,思维,STL栈)
- mysql 磁盘组_有效管理 ASM 磁盘组空间
- ios 代码设置控件宽高比_iOS--利用比例纯代码适配屏幕大小
- 华为手机获取状态栏高度是错误的_你的华为手机状态栏有HD图标吗?这又代表着什么?看完你就懂了...
- 星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com
- 对计算机的分析,对计算机思维的逻辑分析(范文).doc
- go语言快速刷《程序员面试金典》(3)
- leetcode44. 通配符匹配 又是一道没有解释的字符串dp困难题
- 关系数据库——关系数据语言
- Redis:17---常用功能之(事务)