位置: 编程技术 - 正文

Android 编程下 Touch 事件的分发和响应机制(安卓编程视频教程)

编辑:rootadmin

推荐整理分享Android 编程下 Touch 事件的分发和响应机制(安卓编程视频教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android 编程工具,android编程教程,android编程技术,android编程入门,安卓端编程,android编程教程,android编程app,android编程实例,内容如对您有帮助,希望把文章链接给更多的朋友!

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 方法。Android 编程下 Touch 事件的分发和响应机制(安卓编程视频教程)

▐ 事件拦截: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 时相同。

到这里,与 Touch 事件相关的三个方法就分析完毕了。下面的内容会通过各种不同的的测试案例来验证上文中三个方法对事件的处理逻辑。

参考博客:

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 初始化之Zygote 系统整体框架了解android初始化之前,有必要了解一下系统的整体框架,下图是网上流传比较经典的架构图:android的启动主要是linux内核启动之后,init进

android FileNotFoundException(Is a Directory)解决办法 最近公司项目要求把从服务器读取的图片存到本地SD卡中,一开始以为很轻松啊,听着小曲,看着视频,敲着代码,这小资生活。。。。咳咳,扯远了,

Android Studio使用技巧系列教程(一) 尊重劳动成果,转载请注明出处:

标签: 安卓编程视频教程

本文链接地址:https://www.jiuchutong.com/biancheng/380965.html 转载请保留说明!

上一篇:Android TabHost布局(android tabview)

下一篇:Android 初始化之Zygote(安卓初始化)

  • 小规模纳税人所得税税率是5还是2.5
  • 城建税是什么税率
  • 员工工伤住院伙食补助标准是多少
  • 普票不能抵扣要坐在帐里吗
  • 算税负是用含税的吗
  • 公司不交工会经费的原因,风险说明
  • 固定资产类型表
  • 已经开了发票需要退款怎么处理
  • 什么叫备品备件
  • 预缴增值税项目编号填写错误怎么办
  • 收到的房租增值税专用发票可以抵扣吗
  • 企业清算期间留抵的税额如何做会计处理?
  • 非增值税纳税人有哪些
  • 津贴补助如何缴纳个税
  • 外贸出口企业城市排名
  • 电力设备维护费增值税税率
  • 设备租赁涉及税种
  • 公司购买地下停车位如何入账
  • 个人所得税减免申请
  • 公司注销后银行账户怎么注销
  • 金融服务利息税率是多少
  • 补提以前年度摊销
  • 金蝶如何结转折旧费用的操作步骤
  • 跨越红字专用发票开票流程
  • 不缴或少缴应纳税款的行为属于
  • window11如何打开任务管理器
  • session php用法
  • 携税宝的作用
  • 固定资产成本中的相关税费
  • PQV2ISECURITY.EXE - PQV2ISECURITY是什么进程 有什么用
  • 存货资产减值损益怎么算
  • 不动产租赁费计入什么科目
  • 常见的财务报表分析方法有多选题
  • 长期借款科目的期末余额反映尚未偿还的借款本金
  • PHP:mcrypt_generic()的用法_Mcrypt函数
  • 代购货物的缴税情况
  • 利润表应根据什么编制
  • 房产税和土地使用税什么时候申报
  • 工会福利如何做账
  • win11硬件加速gpu计划怎么关
  • php中input的用法
  • 劳务派遣开具发票
  • 购买方已认证怎么开具红字信息表
  • ubuntu中安装opencv
  • 小规模纳税人销售商品会计分录
  • 自有资金等于货币资金吗
  • 当月入账的进项税必须当月认证吗
  • 物业公司收取的电费怎么确认收入
  • 报销发票哪些可以抵税
  • 企业应收账款怎么记账
  • 企业中间投入
  • 罚款支出算费用吗
  • 计提投资性房地产折旧会计科目
  • 递延收益为什么不影响利润总额
  • 公允价值变动损益和投资收益区别
  • 银行回单模板
  • 免征印花税的6个项目
  • 从增值税抵扣进项怎么算
  • 日记账的建账工作
  • 直接计算法是依据零件图样上给定的尺寸
  • linux系统中的用户大体可分为三组
  • linux系统检测工具
  • 国产操作系统有免费的吗
  • 联想lenovoideapad700-15isk
  • win8资源管理器未响应
  • iis的安全性设置主要包括
  • unitysharder
  • js拖动图片
  • Android游戏开发案例教程小小弹球
  • 用css制作网页的步骤
  • Python+Wordpress制作小说站
  • linux使用adb
  • python元组和数组
  • c语言node定义
  • e87移植
  • javascript 做网页
  • 安徽省国家税务总局电子税务局
  • 江苏电子税务局社保缴费打印
  • 残疾人企业如何申请补贴
  • 企业资金运转资金投放
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设