View的事件分发机制

来源:互联网 发布:python编程入门 epub 编辑:程序博客网 时间:2024/05/16 14:01

点击事件的传递规则

MotionEvent即点击事件,所谓点击事件的事件分发,其实就是对MotionEvent时间的分发过程,即当一个MotionEvent产生以后,系统需要把这个时间传递给一个具体的View,而这个传递的过程就是分发过程。点击事件分发过程由三个很重要的方法来共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。

public boolean dispatchTouchEvent(MotionEvent event)

用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,表示是否消耗当前事件。

onInterceptTouchEvent()

它是ViewGroup的一个方法,在这个方法内部调用,用来判断是否拦截某个时间,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会再次调用,返回结果表示是否拦截当前事件。

public boolean onTouchEvent(MotionEvent event)

在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个时间序列中,当前View无法再次接收到事件。
点击事件的传递规则:
对于一个跟ViewGroup来说,点击事件产生后,首先会传递给它,这时候它的dispatchTouchEvent就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示他要拦截当前事件,接着这个事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果ViewGroup的onInterceptTouchEvent方法返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素dispatchTouchEvent方法就会被调用,如此反复知道事件最终被处理。

当一个View需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouchEvent方法被调用。这时事件如何处理还要看onTouch的返回值,如果返回false,则当前View的onTouchEvent方法会被调用;如果返回true,那么onTouchEvent方法将不会调用。由此可见,给View设置的OnTouchListener,其优先级比onTouchEvent要高。在onTouchEvent方法中,如果当前设置的有OnClickListener,那么它的onClick方法会被调用。可以看出平时我们常用的OnClickListener,其优先级最低,即处于时间传递的尾端。

当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View。顶级的View接收到事件后,就会按照事件分发机制去分发事件。考虑一种情况如果一个View的onTouchEvent返回false,那么它的父容器的onTouchEvent将会被调用。以此类推。如果所有元素都不处理这个事件,那么这个时间最终传递给Activity处理,即Activity的onTouchEvent方法会被调用。

0 0
原创粉丝点击