文档章节

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
2018/07/12
0
0
安卓自定义View进阶-事件分发机制原理

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

猴亮屏
2018/05/22
0
0
Android Touch事件传递机制解析

没事逛论坛,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把android touch机制好好看了一下,呵呵。。 an...

长平狐
2012/10/09
2.1K
0
android事件分发机制总结

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

亓斌哥哥
2014/10/08
0
1
Android 官方架构组件(一)——Lifecycle

什么是Lifecycle? Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。...

Android小安
01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
41分钟前
1
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部