您的位置:首页 > 其它

事件分发机制

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事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: