您的位置:首页 > 其它

Andorid事件传递过程

2014-02-21 16:58 288 查看
一个好的应用与用户的体验分不开,用户体验好就是对事件的处理适当.要处理好Android事件处理,就必须了解Android中事件的传递过程.下面是我对Andorid事件的理解,如果有不对地方,请给我指出来!

Android页面由2个元素组成,一个是Activity,另一个是View.而事件产生于页面,所以来了解一下事件是怎么样在View与Activity中传递的.

事件首先由系统传递到View,如果View不处理再传递到Activity,而Activity中接收的方法是onTouchEvent(MotionEvent ev);

在View中涉及三个方与事件传递

dispatchTouchEvent(MotionEvent ev); 对事件进行分发
onInterceptTouchEvent(MotionEvent ev);对事件进行拦截
onTouchEvent(MotionEvent ev);对事件进行处理

那么事件是怎么在View中传递的呢?

从顶层向底层传递
先到方法1,再到方法2,最后到方法3

而具体传递与三个方法返回值有关.

一,dispatchTouchEvent(MotionEvent ev)

这个方法必须调用super.dispatchTouchEvent(MotionEvenet ev);如果不调用则所有事件都不会继续向下传递.此时如果返回true,则所有事件都只会传递到这个方法后停止传递.如果返回false,则所有事件都只传递到这个View中方法3
如果返回true,则交给这个View的onTouchEvent处理.
如果返回false,第一次交给onInterceptTouchEvent处理,看是否拦截.

二,onInterceptTouchEvent(MotionEvent ev),这个方法只调用一次,就是事件第一次传递来的时候,其它的事件如ACTION_MOVE,ACTION_CANCEL等都不会进入此方法;

如果返回true,则事件直接进入onTouchEvent方法,表示这个事件已经拦截,这个事件以后的所有action都会直接进入到onTouchEvent方法中.
如果返回false,则事件会进入到下层的View中

三,onTouchEvent(MotionEvent ev)

如果返回true,表明这个事件已经被处理,这个事件就在这里停止,不会继续传递了.
如果返回false,表明这个View没有处理这个事件,这个事件会继续传递,传递到上层View的onTouchEvent中,如果View一直没有处理,则最后传递到Activity中.



注意:

dispitch是事件分发,返回true,则表示事件已经分发,false表明不分发事件.
intercept是事件的拦截,返回true,表示事件已经拦截,false表明不拦截事件,事件继续向下传
onTouch是事件的处理,返回true,表示事件已经处理,等待事件的后续action,返回false,表示不处理事件,事件继续传递.
一旦事件到o点,则事件的后续动作(action)直接进入到12车道,因此我将12道称作为快车道.

事件产生时,系统经过1路径进入到View,因此路径1是出发站.

事件经过1到达a_a,如果a_a直接(不调用super.dispatchTouchEvent)返回true,则表示事件已经分发,但是并没有真正分发下去,只是a_a自己处理了,所有后继的所有事件都只到达a_a.a如果a_a直接返回false,表示事件不分发,此是事件进入到15道,此时事件到达了o点,后续事件进入会进入12道.如果不是直接返回false,则会进入到车道2,这是正常的事件处理过程.因此a_a点一定要调用super.dispatchTouchEvent进行事件的真正的分发.
事件到达a_b后,是询问对事件是否进行拦截.如果返回true,表示要进行拦截,进入到车道3到达a_c.在a_c不进入到o点情况下,此时后继事件进入到了车道13,a_b点返回false,表示不拦截事件.则进入到车道5到达b_a点.
b_a点返回false,表示不拦截事件,则进入到14道到达a_c点.后续的事件就会进入到13车道直接到达a_c点.返回直接返回true,则所有事件都会在这里,所有action都会走1-2-3-5路.调用了super.dispatchTouchEvent返回true,则会进入6道到达b_b点.
到达b_b后,如果返回true,则进行拦截,进入到7道到达b_c.b_c返回false,到达a_c,如果a_c返回true后续事件进入到13道.返回false事件进入11到达o点,后续事件进入12道.b_c返回true,表示事件已经被处理掉了,此时后续事件进入到了1-2-3-5-15道.不会进入到b_b点.b_b返回false,则进入8道到达c_c点.c_c点返回true,则事件被处理掉,后续事件会进入到1-2-3-5-6-8返回true,则进入到9道到达b_c点.b_c返回true,则后续事件进入到1-2-35-15到达b_c点.否则返回到a_c点,a_c点返回true,后续事件会进入到1-13到达a_c点.如果a_c点返回false,则进入到o点,此后事件会进行12车道.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: