美文网首页
事件分发探究

事件分发探究

作者: 墨源为水 | 来源:发表于2021-02-01 11:44 被阅读0次

    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 事件,那么后续事件也不会传递给它。

    相关文章

      网友评论

          本文标题:事件分发探究

          本文链接:https://www.haomeiwen.com/subject/tttogktx.html