android 快速理解事件分发机制

来源:互联网 发布:mybatis sql注入 编辑:程序博客网 时间:2024/05/19 16:02

事件的触发成功其实有三个坎,只有这三个坎都过了才能让我们见到他的触发效果。那么到底是哪三个方法阻

碍了事件的分发呢??下面我先一个一个的介绍,当然这里触发的顺序也是按数序。


一.onInterceptTouchEvent事件


这个方法主要是viewgroup的事件拦截,也就是说是view父类的方法。如果你是最基础的view那么你就

不会有这个方法,其实想想也对你没有子view拦截什么呀。这个方法如果设置true的话那么touch事件就不会传入

子view中去,意思就是说如果你在父view这里设置true的话,那个触摸事件只能在父view触发。举个例子就是如

果你有一个相对布局,里面有一个button。这里你对相对布局里面设置了onInterceptTouchEvent事件是true

的话,那么你对button的点击事件就失效了。这里的touch事件其实已经被相对布局所拦截。一般情况下默认设置

false。


 @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);    }


二.dispatchTouchEvent事件


这个方法是事件的分发,也就是你需要触发onTouchEvent事件不但需要父viewonInterceptTouchEvent

同意,还需要本身的dispatchTouchEvent的事件同意分发这个事件,onTouchEvent事件才有资格处理这个事

件。不然的话那么这个事件只能又返回到父view去消费了!!


<span style="font-family:SimSun;"> @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        return super.dispatchTouchEvent(ev);    }</span>


三.onTouchEvent事件

首先系统view的onTouchEvent事件中包含了一系列的action,例如

ACTION_CANCEL ACTION_DOW ACTION_UP ACTION_MOVE ACTION_OUTSIDE

这些动作组成。一次事件只有在第一个action返回true之后才会接下来发生另一个动作。

onTouchEvent这个方法最后会返回一个true or false 表示这个事件是否消费。当它返回true的时候表示这个事件消费了,false表示没有消费就

会返回到父类去消费。当然 onTouchEvent事件中的action过程中只要首先有一个返回true or false  那么这个事件对应的就全都是true or  

false,因为一次onTouchEvent事件只能有一个返回值。当然你的下一次onTouchEvent事件又可以重新定义了。(一次action就会调用一次

onTouchEvent事件,onTouchEvent事件包含了一系列的action)


 @Override    public boolean onTouchEvent(MotionEvent event) {        return super.onTouchEvent(event);    }


四.事件的分发的相关性

这里我来系统的说明一下他们之间的关系:


一.事件先传到父view 的onInterceptTouchEvent方法中判断是否拦截事件传递到子view(一般系统

认不拦截),如果拦截的话那么父view自己消费继续下面的二与三方法。事件拦截是从父view开始。


二.当一中表明不拦截,那么事件传递到底层子view的dispatchTouchEvent方法中判断是否分配(一般

分配),如果不允许分配的话,那么事件就会返回到父view去执行二与三方法。


三.当二中显示允许传递那么接下来就是onTouchEvent事件判断是否消费(这里一般系统默认消费),如果

onTouchEvent事件显示不消费的那么事件就会返回到父view中去执行二.三方法判断是否消费这个事件(这里

说明下onTouchEvent消费事件都是从最底层view开始处理)。


四。下面是view之间的响应方法的关系图




五.总结


五.总结

这里我是根据网上的一些大牛的文章总结而来,只是简单的介绍一下他们之间的关系。对于简单的了解因该是

够了。如果你想要深入源码了解他们的机制的话,下面我推荐一下guolin大神的文

章:http://blog.csdn.net/guolin_blog/article/details/9097463




0 0
原创粉丝点击