美文网首页
android 扣扣事件分发机制 dispatchTouchEv

android 扣扣事件分发机制 dispatchTouchEv

作者: 品味与回味 | 来源:发表于2018-01-19 15:46 被阅读24次

    dispatchTouchEvent : 分发事件
    onInterceptTouchEvent : 拦截事件
    onTouchEvent : 消费事件

    这个是三个方法的最基本的作用

    image.png

    网上的图 。 https://zhuanlan.zhihu.com/p/27608989

    从这个图 我们可以看到一个清晰的结构。

    首先说一下 activity和view 为什么没有拦截onInterceptTouchEvent 因为这是在对顶和最下面的结构, 加上这个方法完全没有意义,

    至于这几个方法的顺序问题 我们也来通过几个图 来看一下


    image.png

    我们可以看出来什么。viewgroup是从dispatchTouchEvent 开始 并且以他结束。中介掺杂着onInterceptTouchEvent 拦截方法。

    image.png

    这是当 viewgroup 当中有view的时候 顺序情况

    我们可以看出来的执行顺序。 就是从外层到里层去判断。

    1 首先vewgroup是不是要消费这个事件。
    2 vewgroup是不是拦截这个事件。
    上面的两个如果都是true的话 那么这个事件都不会执行到子view的方法。
    上面的图 子view 也没有消费掉这个事件onTouchEvent 返回的false,这个事件没有消费出去,也就是没有派发出去,那么子View的dispatchTouchEvent()方法返回false,把这个事件交还给上一层的ViewGroup。ViewGroup发现这个事件没有子View消费,那么就自己动手吧!将事件传给自己的onTouchEvent()方法消费。可是ViewGroup也没有消费,那么onTouchEvent()方法只能是再返回false了。同理,ViewGroup自己没有消费事件,因此他的dispatchTouchEvent()方法也返回了false。

    说直白点。如果里外有好几层的话。 那么,分发机制都是从最外层开始。逐层往里面去循环。当你哪一层需要对这个事件去有反应的话。 那么就在去消费这个事件,dispatchTouchEvent 返回的true就可以。 当然ontouchevent 也肯定返回的是true。

    image.png

    View明确表示要消费这个事件序列,因此从ACTION_DOWN开始的所有事件就都交给他消费了。所以子View的onTouchEvent的返回值为true,表示自己需要消费这个事件,然后他的dispatchTouchEvent也返回了true,表示这一事件被自己分发了。既然自己的子View消费了事件,ViewGroup就认为这一事件是被自己分发了,因此他的dispatchTouchEvent也就返回了true。

    然后在来看一个表

    来源https://www.cnblogs.com/aademeng/articles/6551337.html

    image.png

    dispathtouchevent 方法 返回true的时候 都是代表当前view 处理掉这个事件。
    所以我们思考一下。 当我们有好几层的时候。然后出现焦点混乱 是什么造成的?
    明明应该滑动的不滑动。不该滑动的确实滑动了。 这个情况的出现就是焦点混乱。dispatch。。。方法就不应该是true。 你也可以理解成为 你想要你里面的结构 响应一些操作的话。 那么外面你自己定义的一个groupview dispath..和拦截方法。返回的都应该是false, 不能是true。要不下面的方法 都不会响应。

    image.png

    上面的表格。这个我觉得是有点问题的

    image.png

    你的dispatchTouchEvent 方法 首先不知道是第几层。 有可能是activity 有可以是viewgroup 还有可能是view。 不是对底层的话。 都是有可能 会是向下传递的 , 因为她是返回的false。最下层的话。那么返回的就是父控件

    大家 有没有这么想的。。 这样就错了。 我也这么想过 - -

    还记着这个图吗,dispatchTouchEvent 这个是两部分。start 开始 和最后的return 这个是一个过程。 当他返回的时候,可能是要返回的到上面!!!

    什么 不明白?

    你可以理解成为一个{

    return 这个才是返回值 而在他们的上面 都是一个过程的第一层的dispatchTouchEvent 不拦截 不消费,那么就会循环到childview里面去做判断。 当里面的dispatchTouchEvent 返回true的时候说明里面的{ } 搞定了 然后要给他的上层了 也就是父类,
    }

    所以 这几个方法 还是要区分的作用的 在说大白话一点

    dispatchTouchEvent 这个值 在我们最外层的时候 返回的是 true的话。 我们里面的子view还会不会执行。 会的(如果你不拦截的话。 所以 如果 你不想子view执行的话 那么你返回值 要是true 还要拦截。这样才不会进入到子view。)

    https://www.cnblogs.com/aademeng/articles/6551337.html 很棒

    https://www.jianshu.com/p/b61a49e0279f

    相关文章

      网友评论

          本文标题:android 扣扣事件分发机制 dispatchTouchEv

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