文档章节

Android 事件分发

x
 xjfxjf
发布于 2016/07/27 19:28
字数 997
阅读 6
收藏 0

 Android 的事件分发过程如下:

首先Android的事件会分发到Activity里面,然后再往View视图下面分发,在View视图里面,会先分发到父视图,再往子视图分发,全部流程如下:

首先会调用Activity的dispatchEvent方法,然后会调用ViewGroup的DispatchEvent()方法,这时候就要分几种情况讨论了,首先,事件分为Down,Move,Up事件,

1,假设父类不拦截事件,也不消费事件,即ViewGroup的onInterceptTouchEvent()返回false,而且ViewGroup没有实现OnClick()方法,也没有实现onTouch方法(或者onTouch方法有实现,但返回false,即不消费事件),也没有实现onTouchEvent方法(或者实现了onTouchEvent()但返回false,即代表不消费事件),此时,只讨论子view,子view也分两种,一种是可点击的(Button),另一种是不可点击的(TextView),此时再分两种情况讨论,

(1)可点击子view,这种View是默认可点击的,即默认onTouchEvent()方法默认返回true,即会消费任何事件,假设这种view有实现onTouch()方法,并且返回true,则事件会先分发到此处,并且不会继续往下分发,如果返回false,则事件会继续往下分发,则继续调用onTouchEvent()方法,假设有实现onClick方法,那么OnClick方法是在调用onTouchEventh后的up事件之后调用它的。

可点击的默认消费所有事件,假设这个子View是自定义的,并且继承可点击的view,如果在自定义它只消费Down事件,那么,剩余的事件会继续往这个view分发,但由于父类事件不拦截,不消费,那么Move事件会传到这个View,但他不消费之后,这个事件会直接调用Activity的onTouchEvent事件,up事件也是一样。

假设这个view消费Down事件和Move事件,那么up事件一样会传到这个View上,但UP事件由于不被消费,所以直接返回调用Activity的onTouchEvent方法,

假设这个View不消费Down,Move和UP事件,那么当事件传到这个View时,他会一步一步往上传给父控件,即调用父控件的onTouchEvent方法,由于父类默认不拦截,那么事件会逐步返回到Activity上,并且调用Activity的onTouchEvent方法,然后剩余的事件都不会往下传递了,都由Activity消费

由于继承可点击和不可点击的控件的事件传输是一样,都是由onTouchEvent的返回值控制,

2当父类ViewGroup拦截事件时,即onInterceptTouchEvent()方法返回true,那么事件疆全部由父类消费,不会传递到子类,此时事件会去调用它的onTouchEvent方法,假如消费Down事件返回true,那么接下来的事件都会去分发到这里,如果Move事件不消费,那么就会直接调用Activity的onTouchEvent方法,up事件也是,如果只消费Move事件,那么Down事件会传递到这个onTouchEvent里面,由于不消费,那么事件会逐步往上传递,最终传递到Activity的onTouchEvent里面。那么接下来的Move事件就不会传递下来,而是直接在Acitivty里面被消费。

 

3假设ViewGroup拦截Move事件,但不消费事件,那么当事件穿戴到子view时,如果子view消费

事件,那么接下来的事件也会分发下去,当遇到Move事件时,那么那个时间就会被ViewGroup拦截,并且调用ViewGroup的onTouchEvent,由于ViewGroup只拦截,不消费,那么事件会直接分发给Activity,即调用Activity的onTouchEvent方法。而接下来的up事件,即便ViewGroup拦截,也不会被ViewGroup消费,而是直接分发给那个消费Down事件的view。

4假设ViewGroup只拦截up事件,那么事件会直接分发给子view,而不是自己消费。

 

© 著作权归作者所有

共有 人打赏支持
x
粉丝 0
博文 4
码字总数 1194
作品 0
广州
Android 机制篇 - 事件分发机制超详解(🔥🔥🔥🔥🔥🔥🔥🔥)

Android 虽然不是四大组件,但其并不比四大组件的地位低(涉及面的广度和深入甚至比四大组件还复杂🔥)。而View的核心知识点“事件分发机制”则是不少刚入门同学的拦路虎(1、项目中处处遇...

Pepsimaxin
07/12
0
0
安卓自定义View进阶-事件分发机制原理

安卓自定义View进阶-事件分发机制原理 之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部...

猴亮屏
05/22
0
0
android事件分发机制总结

Android事件分发机制 在android 普通view(不包含ViewGroup)和activity中主要有一下两个方法处理事件: public boolean dispatchTouchEvent(MotionEvent ev) // 分发事件public boolean on...

亓斌哥哥
2014/10/08
0
1
Android中父View和子view的点击事件的执行过程

Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTIONDOWN->ACTIONMOV...

火云
2015/06/11
0
0
Android view事件分发初步

点击事件用MotionEvent表示,最重要的事件分别是: 手指按下:ACTION_DOWN 手指移动:ACTION_MOVE 手指抬起:ACTION_UP 点击事件的分发始于Activity,通过Window,然后再传递到View MotionEv...

京一
08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
3
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部