文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

Windows 10 设置 Java 环境变量

首先你需要在我的电脑中打开,找到环境变量属性。 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面。 在这个界面中设置高级系统设置。 环境变量 在弹出的界面中选择设置环境...

honeymose
55分钟前
1
0
用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
5
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
4
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部