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的返回值决定的。
Android事件机制:事件传递和消费相关推荐
- click事件在什么时候出发_超全的js事件机制amp;事件委托
超全的js事件机制&事件委托,想要理解js事件只需认真看完此篇即可~ 目录结构: 什么是事件机制 事件冒泡事件捕获 DOM事件流事件委托 误区 在同一个对象上注册事件,并不一定按照注册顺序执行 ...
- FLEX事件机制整理
一.引 很多新人对Flex的事件机制都不太熟悉,在使用过程中难免会出现各种问题,这是一个非常普遍的问题,为了更快更好的帮助大家,将介绍一下Flex中事件的各种机制和用法. Flex的精髓之一就是事件和 ...
- 移除元素所有事件监听_前端日记—DOM 事件机制和事件委托
DOM事件机制 事件指的就是就是onclick,onmouseover,onmouseout等. 2002年W3C规定了浏览器的事件调用顺序标准,这其中有两个关键术语. 事件捕获:简单一点解释事件捕获 ...
- Android Activity 和 ViewGroup中事件触发和传递机制
在Android中,Activity和View都能接收触摸和按键事件,如果响应事件只需要在继承类里复写事件函数即可. 1.在只有Activity的情况: 1)Touch事件触发流程: 首先触发d ...
- Android 系统(74)---Android手势触摸事件的分发和消费机制
Android手势&触摸事件的分发和消费机制 在Android 客户端开发过程中,经常会遇到手势事件的处理,本篇博文讲一下本人对touch事件处理机制的一些理解,希望对一些初级开发者有所帮助. ...
- android方向触摸事件,Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- android touch事件坐标原点,图解Android:Touch事件传递机制
前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...
- Android 触摸事件(Touch)的传递机制
Touch 事件的传递机制 一个完整的touch 事件,由一个 down 事件.n 个 move 事件,一个 up 事件组成. Touch 事 件 一 般 的 传 递 流 程 Activity--&g ...
- android 触摸事件 控制,Android笔记:触摸事件的分析与总结----TouchEvent处理机制
其他相关博文: Android中的事件类型分为按键事件和屏幕触摸事件.TouchEvent是屏幕触摸事件的基础事件,要深入了解屏幕触摸事件的处理机制,就必须掌握TouchEvent在整个触摸事件中的转 ...
最新文章
- java 反射获取父类的字段_java反射获取父类和子类字段值、赋值
- android 开发jni,示例:hello-jni
- Linux操作系统下以不同颜色命名的文件类型
- SpringContextHolder 静态持有SpringContext的引用
- 在Spark中自定义Kryo序列化输入输出API(转)
- Java面试题:线程实现的两种方式及匿名内部类实现
- 【OpenCV 例程200篇】56. 低通盒式滤波器
- DDD专家张逸:构建领域驱动设计知识体系
- 2017.9.19 Gcd 思考记录
- appium学习链接记录
- 【图像修复】基于matlab全变分TV+curvelet变换彩色图像修复【含Matlab源码 461期】
- c语言程序开发分为四个步骤,c语言程序开发的步骤
- 规则引擎如何实现生产调度系统
- Kaggle —— 泰坦尼克号
- LMS自适应滤波的MATLAB实现——实例仿真
- MPEG-4标准定义的音频压缩格式AAC详解
- Redis-Lua脚本(集成SpringBoot工程)
- Free校园小程序 开源发布,一款集合表白墙、失物招领、兼职和闲置二手买卖的云开发微信小程序
- 电巢:继腾讯与联通混改后,又有两家企业官宣,科技巨头与国企混改,意味着什么?
- Windows Project2016如何增加加班工时。
热门文章
- java搜索文件夹中文件是否存在_java中判断文件文件夹是否存在的方法(附代码)...
- msvc 编译路径_Colmap编译教程
- flutter git 拉不起来_「干货」Flutter开发环境配置备忘录
- netty中的future和promise源码分析(二)
- 让Python不在mac的dock上显示火箭图标
- LAMMP源码环境搭建
- 将页面多个下拉框的值以字符串拼接方式存放至数据库一个字段中
- phpstorm设置的快捷键突然失效了,提示: IdeaVim ...
- mvc学习-编辑提交需要注意-mvc重点
- 【R语言学习】时间序列