Android中的事件分发、拦截、消费机制

来源:互联网 发布:php.cgi漏洞 编辑:程序博客网 时间:2024/06/06 02:41

首先明白一个问题,一个完整的Touch事件,应该是由一个Down、一个Up和若干个Move组成的。谁处理了Down事件,他才具有处理UP、MOVE事件。

view有dispatchTouchEvent()、onTouchEvent()。ViewGroup继承View,ViewGroup比View多一个onInterceptTouchEvent()方法。Activity也只有dispatchTouchEvent()、onTouchEvent()两个方法。

dispatchTouchEvent

当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。无论是Activity还是View,如前文所说,事件分发自身也具有消费能力。

1. 返回true时,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结(不见了,被搁浅了)。(Actvitiy\View\ViewGroup都是)

2. 返回false时,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。(如果是Activity的dispatchTouchEvent,那么Touch将被系统消费或处理。如果是ViewGroup的dispatchTouchEvent,那么Touch交给Activity的onTouchEvent方法处理,如果是View的dispatchTouchEvent,Touch交给ViewGroup的onTouchEvevt()方法处理。)

3 . 返回默认super.dispatchTouchEvent(ev) ,事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理。(如果本层控件是Activity,没有事件拦由于其截,因此将直接将事件传递到子ViewGroup,并交给ViewGroup的事件分发dispatchTouchEvent进行处理,如果是ViewGroup的,事件将分发给本层的ViewGroup事件拦截onInterceptTouchEvent 方法进行处理,如果是view , 事件将分发给本层的view 事件处理onTouchEvent方法进行处理)。

onInterceptTouchEvent(Activity和View都没有此方法)

1. 返回true时,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理。(Activtiy , View ,ViewGroup三个都是如此)

2. 返回false或是onInterceptTouchEvent(ev)时,则表示不对事件进行拦截,事件得以成功分发到子View,并由子View的dispatchTouchEvent进行处理。()

onTouchEvent

1. 返回true时,表示这层onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。一开始产生的是Down事件,Down事件在这里被处理了,UP、MOVE事件在这个层也被处理了。

2. 返回false或是onInterceptTouchEvent(ev)时,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理。如果上层在不处理,在往上冒。一直到被处理为止。

总结一下:

1.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。

2.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。

3.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。

4.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。

5.onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。















0 0
原创粉丝点击