View事件分发机制知识点(一)

1.OnTouchListeneronTouchEventOnClickListener

当一个View需要处理事件,如果设置OnTouchListener,那么OnTouchListener中的onTouch会被回调,如果onTouch返回true,那么onTouchEvent方法不会被调用;如果返回false,则当前View的onTouchEvent方法会被调用(OnTouchListener优先级大于onTouchEvent),设置了OnClickListener,那么它的onClick方法会被调用,可以看出,我们平时用的OnClickListener,优先级最低,处于事件传递的尾端。

2.一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View(顶级),顶级View接收到事件后,按照事件分发机制去分发事件,根ViewGroup的dispatchTouchEvent被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回false,就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,直到事件被最终处理。

3.如果一个View的onTouchEvent返回false,那么它的父容器的onTouchEvent将会被调用,如果所有元素都不处理这个事件, 那么这个事件将会最终传递给Activity处理,即Activity的onTouchEvent方法会被调用

4.View没有onInterceptTouchEvent方法,一旦有点击事件传递给它,那么它的onTouchEvent方法就会被调用。ViewGroup默认不拦截任何事件。Android源码中ViewGroup的onInterceptTouchEvent方法就会被调用。

5.View的onTouchEvent默认都会消耗事件(返回ture),除非它是不可点击的(clickable和longClickable同时为false),View的longClickable默认false,clickable属性分情况(Button默认true,TextView默认false)。

6.事件传递过程是由外向内的,即事件总是先传递给父元素,然后再由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。

你可能感兴趣的:(View事件分发机制知识点(一))