美文网首页
事件分发机制

事件分发机制

作者: 安逸_40f3 | 来源:发表于2018-08-08 16:58 被阅读0次

    主要涉及 View 和 ViewGroup (在 xml 中 设置)

            View 只有 onTouchEvent 和 dispatchTouchEvent 两个方法。

            ViewGroup 有 onTouchEvent / dispatchTouchEvent 和 onInterceptTouchEvent 三个方法。

    注意事项:

            View 或 ViewGroup 有两个核心的行为:拦截(intercept) 和 消费(consume)。这两者是相互独立的,拦截不一定消费。是否要拦截看         onIntercepTouchEvent。是否要消费看 onTouchEvent。

    方法理解

    DispatchTouchEvent,

            该方法封装了事件分发的整个过程。是事件分发的 调度者 和 指挥官 。的核心过程均在该方法中。下面的onInterceptTouchEvent 和 onTouchEvent的回调的调用就在该方法体中。是否传递事件到onInterceptTouchEvent 和 onTouchEvent 由dispatchTouchEvent 决定。

    OnInterceptTouchEvent,

            该方法决定了是否拦截事件。只有ViewGroup 有该回调。返回true表示拦截,返回false表示不拦截。自定义 View的时候,可以重载该方法,通过一些特定的逻辑来决定是否拦截事件。如果拦截,接下来会调用该 ViewGroup 的 onTouchEvent来处理事件。

    OnTouchEvent,                

            该方法处理了事件,并决定是否继续消费后续事件。该方法调用的前置条件:该 View 拦截了事件子 View 都不消费事件没有子 View该方法正式处理 MotionEvent。返回true表示消费,返回false不消费。如果消费,接下来的事件还会传递到该 View 的dispatchTouchEvent 中;如果不消费,后面的事件不会再传过来。onTouchListener 的 onTouch 回调,和 onTouchEvent一样,优先级比 onTouchEvent 高,如果有设置该监听,并且onTouch 返回true,就不会再调用 onTouchEvent 了。如果返回false,事件还是会传递到 onTouchEvent 中。

    特殊情况 子 View –requestDisallowInterceptTouchEvent

            比较特殊的情况有,子 View 可以使用 requestDisallowInterceptTouchEvent 影响去父 View的分发,可以决定父 View 是否要调用 onInterceptTouchEvent。比如,requestDisallowInterceptTouchEvent(true),父 View就不用调用 onInterceptTouchEvent来判断拦截,而就是不拦截。该方法可以用来解决手势冲突。比如子 View先消费了事件,但是后面父 View也满足了手势触发的条件而拦截事件,导致子 View手势执行一半后无法继续响应。可以使用requestDisallowInterceptTouchEvent(true),这样后面的事件,父 View 不会走 onInterceptTouchEvent回调来判断是否要拦截事件,而是直接把事件继续传下来。

    相关文章

      网友评论

          本文标题:事件分发机制

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