详解Android Touch事件的传递机制

1、基础知识

(1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。

 

(2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以ACTION_DOWN开始ACTION_UP结束。

 

(3) 对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和OnTouchListener

 

2、传递流程

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

 

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

 

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

 

(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

 

(5) OnTouchListener优先于onTouchEvent()对事件进行消费。

 

上面的消费即表示相应函数返回值为true。

 

更多请直接阅读PDF英文原文:Mastering the Android Touch System,示例代码:Demo@Github。有什么问题可以这里留言。

 

附上两张原文中流程图

(1) View不处理事件流程图

view-ignore-touch-event-example

view-ignore-touch-event-example

 

(2) View处理事件流程图

view-process-touch-event-example

view-process-touch-event-example

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net登录状态验证

文章:ASP.NET 登录验证 文章:ASP.NET MVC下判断用户登录和授权状态方法 文章:.net学习笔记---HttpHandle与HttpModule 第一篇文章,介绍了 1)早期的BasePage类,每个页面继承自BasePage类,取sessi…

Wiki的介绍

何为Wiki(维客)? 首先,我们要搞清楚:wiki概念的发明人是Ward Cunningham。wiki这个字到底是什幺意思呢?根据FAQ的说法,WikiWiki 一词来源于夏威夷语的“wee kee wee kee”,原本是“快…

项目专访|在ESP32上移植Linux

大家好,我是写代码的篮球球痴,最近在网上看到一个非常有意思的项目,有大神把Linux内核移植到ESP32上,并成功运行。在国外网站上,有很多人在议论这件事情https://hackaday.com/2021/07/21/its-linux-but-on-an-esp32/ES…

4.3英寸屏双核 LG Prada K2通过FCC认证

我们此前曝光过一款型号为LG Prada K2的智能手机,这款手机不仅配置出色而且外观极为时尚。如今,来自国外媒体的最新消息显示,LG Prada K2已经通过FCC认证,这意味着它距离上市已经为期不远。 LG Prada K2通过FCC认证 LG Prada K2是…

c语言第4份实验报告,C语言实验报告04.doc

实验报告人:张静成 数学3班 10080338一、实验目的1、掌握选择结构的程序书写!2、了解条件与程序流程的关系3、了解用不同的数据使程序的流程覆盖不同的语句、分支和路径。二、实验内容(一)、题目 11、题目内容描述:改写第三章小写字母转换为大…

VC中Error spawning cl.exe错误的解决方法.

VC中Error spawning cl.exe错误的解决方法. 转载地址:http://blog.csdn.net/badboyfind/article/details/1816189 可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过。很多人的 选择是…

Swift中空合运算符、闭区间运算符、单侧区间、半开区间

空合运算符(Nil Coalescing Operator) 用于取代3目判空运算,提供超短的写法比如常规判空写法如下,反正我写java就是这么干的 var anOptionalInt: Int? 10var anInt: Int 0if anOptionalInt ! nil { anInt anOptionalInt! } 空…

关于禁止svn客户端长驻内存的方法

公司到目前为止版本控制多用svn,安装后会自动加载tsvncache.exe主程序,尝试手动关闭该进程,过几分钟又会再出现。 使用svn一段时间以来,发现该程序除了会自动加载,偶尔还会自动扫描磁盘空间,并且对于未标记…

国内MCU厂商也开始卷了

最近我大学老师准备做一个项目,需要用到STM32的芯片,然后我就帮忙着一起找,不找不知道,找了才知道这个东西真的是贵。然后我就看了GD32,不了解不知道,这个东西也是真的贵。然后我又去看的MM32,结…

c语言朋友,[原创]写给初学 c语言的朋友

C语言的教材有很多,但基本都没有本质上的区别。随便拿两本里面的内容都差不多。对于第一次学习编程的人来说,看教材会产生很多疑问,比如为什么a a 1;是正确的、什么时候用变量、在什么地方定义变量等等。继续深入学习后又会产生许多疑问&am…

Google Flash转换HTML5工具Swiffy测试版发布

Google今年六月推出的Flash转换HTML5工具已经从实验室转为测试版,并新增一个Flash Professional扩充模组,可以直接将档案储存为HTML5格式。一开始Swiffy仅以网站方式,让使用者上传Flash的.swf档案,支持Flash所使用的swf 8格式与Ac…

求字符串全排列的递归算法

求字符串全排列的递归算法 void permutation(char * p_str, char * p_begin) { if(!p_str || !p_begin) { return; } if(\0 *p_begin) { printf("%s\n", p_str); }else { char * p_ch; for(p_ch p_begin; *p_ch ! \0; p_ch) { char temp; /* Swap …

ssis 排程更新

昨天,在as裡面再次看看以前作的一個cube發現,數據竟然一點都沒變,不大對勁,因為這些數據我都已經刪掉了。同事說是我沒選雪花,星型。我想都不想就說,肯定不是哪個樣子,因為sql 2005根本就沒讓你…

Clipboard.js复制粘贴到剪贴板

来自他人参考链接:https://www.cnblogs.com/kevinCoder/p/6144376.html转载于:https://www.cnblogs.com/jiaqi1719/p/9962342.html

什么是MCU里应尽量遵循的寄存器谨慎赋值法?

有人觉得搞MCU是一件简单的事情,往往觉得简单的事反而出错更多,今天转发一篇我朋友痞子衡的文章,说说MCU里面的寄存器的事。大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_G…

惠普电脑如何下载c语言软件,惠普笔记本电脑上的语言栏怎么弄

满意答案mygood12f32013.01.23采纳率:53% 等级:11已帮助:6723人首先运行“regedit”,展开“HKEY_CURRENT_USER/keyboard layout/preload”分支,在其下新建一个字符串值,命名为“1”,并将它对…

学习C++/C的宏与for循环的结合

#define ABC(x) (((x) > 5 && (x) < 10) ? (x) : 0) for (int i 3; i < 13; i) { cout << "i " << i << ", "; cout << "ABC(i) " << ABC(i) << "\n"; } 结果是&#xf…

windows 7鼠标右键另存为没有桌面选项

问&#xff1a;Windows7 另存为没有桌面文件夹怎么办&#xff1f; 答&#xff1a;在另存为窗口的资源管理器左栏空白处单击鼠标右键&#xff0c;选中“显示所有文件夹”即可。

单件模式(Singleton Pattern)

1、单件模式试用与窗口管理器或者是打印假脱机、数据库连接池&#xff1b;2、目的&#xff1a;在单独得对象实例中&#xff0c;集中了这个对象所属类得所有权利&#xff1b;3、DoNet解决方案 public class DotNetSigleton { private static readonly DotNetSiglet…

LeetCode:二进制手表【401】

LeetCode&#xff1a;二进制手表【401】 题目描述 二进制手表顶部有 4 个 LED 代表小时&#xff08;0-11&#xff09;&#xff0c;底部的 6 个 LED 代表分钟&#xff08;0-59&#xff09;。 每个 LED 代表一个 0 或 1&#xff0c;最低位在右侧。 例如&#xff0c;上面的二进制手…