博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android事件机制之一:事件传递和消费
阅读量:6448 次
发布时间:2019-06-23

本文共 1930 字,大约阅读时间需要 6 分钟。

 关于Android中的事件机制,用到的地方还是很多的,并且这个知识点还真有点复杂。

在写这篇文章前,网上看了不少博文,有的写的感觉挺不错的。只是当时感觉好像理解了,事后又很容易忘。现在自己也系统整理下吧。

Android中的事件在表现形式上有很多,如onTach、onClick和onLongClick等,在具体微观上的表现形势有action_down、action_move和action_up等。

无论哪种事件表现类型,首先都是基于事件的传递模型。其实Android中的事件传递有点类似于JS中事件传递模型。都是基于先捕获然后冒泡的形式。

在捕获阶段,事件先由外部的View接收,然后传递给其内层的View,依次传递到更够接收此事件的最小View单元,完成事件捕获过程;

在冒泡阶段,事件则从事件源的最小View单元开始,依次向外冒泡,将事件对层传递。

事件的捕获和冒泡是整个事件的传递流程,但是在实际的传递过程中,Android中则表现的相对复杂。

主要表现在可以控制每层事件是否继续传递(由事件分发和事件拦截协同进行),以及事件的具体消费(由事件消响应进行,但需要注意的是,事件分发自身也具有事件消费能力)。

也就是本文提及的事件分发、拦截和响应。

Android中不同的控件所具有的事件分发、拦截和响应稍有不同,主要表现在Activity本身不具有事件拦截,不是ViewGroup的最小view单元不具有事件分发和事件拦截(因为它没有自己的子View)。

具体对应关系如下图所示:

对于控制Android中的事件传递和消费机制,最主要需要注意的就是这几个方法的返回值了。

事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。无论是Activity还是View,如前文所说,事件分发自身也具有消费能力,

如果事件分发返回true,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。如果你不想Activity中的任何控件具有任何的事件消费能力,

最简答的方法可以重写此Activity的dispatchTouchEvent方法,直接返回true就ok。

如果事件分发返回 false,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。

当然了,如果本层控件已经是Activity,那么事件将被系统消费或处理。

如果事件分发返回系统默认的 super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理

(如果本层控件是Activity,由于其没有事件拦截,因此将直接将事件传递到子View,并交给子View的事件分发进行处理)。

 

事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev) 

如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理;

如果返回结果是false;则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理。

如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。

 

 事件响应:public boolean onTouchEvent(MotionEvent ev)

如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。

如果onTouchEvent返回false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理。

如果返回super.onTouchEvent(ev),则默认处理的逻辑和返回false时相同。

总结:从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,

只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,

但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。事件是否具有冒泡特是由onTouchEvent的返回值决定的。

 

 测试用例:

 

转载地址:http://amowo.baihongyu.com/

你可能感兴趣的文章
Spring组件扫描<context:component-scan/>使用详解
查看>>
Orchard模块开发全接触4:深度改造前台
查看>>
如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
查看>>
Jetbrains Idea连接TFS时配置的坑
查看>>
MYSQL 中的GROUP BY 的方式 (1)(loose index scan松散扫描 tight index scan紧凑扫描)
查看>>
论文格式注意事项
查看>>
英山往事之健康第一
查看>>
复旦大学游记
查看>>
linux删除文件未释放空间问题处理
查看>>
[20151208]关于Oracle Row Lock.txt
查看>>
JavaScript中的分号插入机制
查看>>
SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
查看>>
[20160921]linux下建立samba服务器.txt
查看>>
在线教育解决方案——亿网软通“互联网+”解决方案助力教育企业
查看>>
VSTO学习笔记(五)批量编辑Excel 2010 x64
查看>>
即时编译和打包您的 Groovy 脚本(转)
查看>>
未能加载文件或程序集 Microsoft.ReportViewer.Common, Version=11.0.0.0
查看>>
嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
查看>>
【直击2017杭州·云栖大会】TECH INSIGHT企业级技术赋能专场
查看>>
服务器托管怎么选择好的服务商
查看>>