事件分发机制
2016-03-01 16:34
274 查看
1.事件分发机制中的onTouch和onTouchEvent有什么区别,又该如何使用?
这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果onTouch方法中
通过返回true将事件消费掉,onTouchEvent将不再会执行。
另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点
击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给他注册onTouch事件将永远得不到执行。
对于这一类控件,如果我们想要监听它的onTouch事件,就必须通过在该控件中重写onTouchEvent方法来实现。
2.请描述Android的事件分发机制
Android的事件分发机制主要是Touch事件分发,有两个主角:ViewGroup和View。Activity的Touch事件事实上是
调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理。
View在ViewGroup内,ViewGroup也可以在其他的ViewGroup内,这时候把内部的ViewGroup当成View来分析。
先分析ViewGroup的处理流程:首先得有个结构模型概念:ViewGroup和View组成了一颗树形结构,最顶层为
Activity的ViewGroup,下面有若干的ViewGroup节点,每个节点之下又有若干的ViewGroup节点或者View节点,以
此类推。
当一个Touch事件到达根节点时,它会依次下发,下发的过程是调用字View的dispatchTouchEvent方法实现的。简
单来说,就是ViewGroup遍历它包含View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,
又会通过调用ViewGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。
dispatchTouchEven方法只负责事件的分发,他拥有boolean类型的返回值,当返回为true时,顺序下发会中断。
1.Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent,
dispatchEvent,onTouchEvent三个相关事件。View包含dispatchTouchEvent,dispatchEvent两个相关事件。其中
ViewGroup又继承于View。
2.ViewGroup 和 View 组成了一个树状结构,根节点为 Activity 内部包含的一个 ViwGroup。
3.触摸事件由 Action_Down、Action_Move、Aciton_UP 组成,其中一次完整的触摸事件中,
Down 和 Up 都只有一个,Move 有若干个,可以为 0 个。
4.当Activity接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分
发的目的是为了找到真正要处理本粗完整触摸事件的View,这个View会在onTouchEvent结果返回true
5.当某个子View返回true时,会终止Down事件的分发,同时在ViewGroup中记录孩子View。接下去的MOVE和UP事件
将有该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上机ViewGroup
保存的会是真实处理事件的View所在的ViewGroup对象。
6.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用
super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触
发Activity的onTouchEvent方法。
7.onInterceptTouchEvent有两个作用:1)拦截DOWN事件的分发2)终止UP和MOVE之间向目标View传递,是的目标
View所在的ViewGroup捕获UP和MOVE事件。
这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果onTouch方法中
通过返回true将事件消费掉,onTouchEvent将不再会执行。
另外需要注意的是,onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点
击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给他注册onTouch事件将永远得不到执行。
对于这一类控件,如果我们想要监听它的onTouch事件,就必须通过在该控件中重写onTouchEvent方法来实现。
2.请描述Android的事件分发机制
Android的事件分发机制主要是Touch事件分发,有两个主角:ViewGroup和View。Activity的Touch事件事实上是
调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理。
View在ViewGroup内,ViewGroup也可以在其他的ViewGroup内,这时候把内部的ViewGroup当成View来分析。
先分析ViewGroup的处理流程:首先得有个结构模型概念:ViewGroup和View组成了一颗树形结构,最顶层为
Activity的ViewGroup,下面有若干的ViewGroup节点,每个节点之下又有若干的ViewGroup节点或者View节点,以
此类推。
当一个Touch事件到达根节点时,它会依次下发,下发的过程是调用字View的dispatchTouchEvent方法实现的。简
单来说,就是ViewGroup遍历它包含View,调用每个View的dispatchTouchEvent方法,而当子View为ViewGroup时,
又会通过调用ViewGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。
dispatchTouchEven方法只负责事件的分发,他拥有boolean类型的返回值,当返回为true时,顺序下发会中断。
1.Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent,
dispatchEvent,onTouchEvent三个相关事件。View包含dispatchTouchEvent,dispatchEvent两个相关事件。其中
ViewGroup又继承于View。
2.ViewGroup 和 View 组成了一个树状结构,根节点为 Activity 内部包含的一个 ViwGroup。
3.触摸事件由 Action_Down、Action_Move、Aciton_UP 组成,其中一次完整的触摸事件中,
Down 和 Up 都只有一个,Move 有若干个,可以为 0 个。
4.当Activity接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分
发的目的是为了找到真正要处理本粗完整触摸事件的View,这个View会在onTouchEvent结果返回true
5.当某个子View返回true时,会终止Down事件的分发,同时在ViewGroup中记录孩子View。接下去的MOVE和UP事件
将有该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上机ViewGroup
保存的会是真实处理事件的View所在的ViewGroup对象。
6.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用
super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触
发Activity的onTouchEvent方法。
7.onInterceptTouchEvent有两个作用:1)拦截DOWN事件的分发2)终止UP和MOVE之间向目标View传递,是的目标
View所在的ViewGroup捕获UP和MOVE事件。
相关文章推荐
- 如何在 visio 2013 中插入数学公式
- Unix Study之--P5光盘安装AIX6.1全实录
- Win内核原理与实现学习笔记1-windows内核版本列表
- Maximum Likelihood Method最大似然法
- BestCoder Round #65 hdu5591(尼姆博弈)
- Mac下Sublime Text 总是以新窗口打开文件的解决办法
- 解决IIS配置HTTPS证书完成证书后刷新后证书消失问题
- 部分性能数据分析的思路
- Java 依赖注入标准 JSR-330 简介
- NSDitionary基本用法
- Android fragment的简单使用
- Filter 验证当前访问用户是否登录
- 性能测试培训:WebSocket协议的接口性能之Jmeter
- 树莓派,使用opencv调用自带的摄像头
- 数据库字符串截取函数substr、substring以及 case when函数使用
- Floyd判圈
- VOS3000-2.1.2.0安装 以及linux注册机、相关环境包
- 3Sum Closest
- MyBatis(3.2.3) - Handling enumeration types
- 应用底部栏之Fragment