事件分发探究

1.dispatchTouchEvent(MotionEvent ev)用于事件分发,将触摸事件向下传递给目标视图,如果它本身就是目标视图,则传递给自己来处理事件。返回结果受自己的 onTouchEvent 和下级 View 的 dispatchTouchEvent 方法影响。

2.onInterceptTouchEvent(MotionEvent ev)用于ViewGroup的是否拦截事件的处理,其中:
返回 false ,则代表不拦截事件;如果返回事件为 true,则拦截事件,并且此事件的后续事件都交给自己来处理,不会再调用此方法询问是否拦截。

3.onTouchEvent(MotionEvent ev)用于View的是否消费事件的处理,其中:
返回 true 代表消费事件;返回 false 代表不消费事件。

三者关系大致如下:

public boolean dispatchTouchEvent(MotionEvent ev){
    boolean consume;
    if(onInterceptTouchEvent(ev)){
        consume = onTouchEvent(ev);
    }else{
        consume = childView.dispatchTouchEvent(ev);
    }
    return consume ;
} 

4.事件传递是从activity到ViewGroups再到target view,形象上可以这么理解,摸了树叶,整个事件流从树根root,到树枝,再到具体的那个树叶。

5.消费事件与拦截事件是两个不同概念,事件流到你这里,消不消费不影响它的流向。onTouchEvent return true,不影响事件流继续流淌。onInterceptTouchEvent return true才会阻截事件流淌。不过需要注意的是:

1.如果一个控件不消费传递过来的 DOWN 事件,那么后续事件不会传递给它。
2.如果一个点击区域的所有控件都不消费事件,那么这个事件最终会传递个 Activity 。
3.ViewGroup 一旦拦截事件后,后续事件就会交给它来处理,并且不会再调用 onInterceptTouchEvent 方法询问是否拦截。

6.requestDisallowInterceptTouchEvent

请求父控件不要拦截事件。属于 ViewParent 的方法,ViewParent是一个接口,ViewGroup 实现了 ViewParent 接口。

注意: View 调用 requestDisallowInterceptTouchEvent 请求父控件不拦截生效有意义的前提是: View接收到了 DOWN 事件,并且消费了 DOWN 事件。如果一个控件不消费 DOWN 事件,那么后续事件也不会传递给它。

你可能感兴趣的:(事件分发探究)