美文网首页
Android Touch事件分发机制

Android Touch事件分发机制

作者: 差不多先生Ai | 来源:发表于2019-03-24 17:49 被阅读0次

    Touch事件相关的方法

    1、dispatchTouchEvent(motionEvent:MotionEvent):Boolean        --------- 事件分发方法,分发Event所调用
    2、onInterceptTouchEvent(motionEvent:MotionEvent):Boolean   --------- 事件拦截方法,拦截Event所调用
    3、onTouchEvent(motionEvent:MotionEvent):Boolean                 ----------事件响应方法,处理Event所调用

    与Touch事件相关的三个主角

    1、Activity(Activity及其子类)
                    dispatchTouchEvent(motionEvent:MotionEvent):Boolean
                    onTouchEvent(motionEvent:MotionEvent):Boolean

    2、ViewGroup
                    dispatchTouchEvent(motionEvent:MotionEvent):Boolean
                    onInterceptTouchEvent(motionEvent:MotionEvent):Boolean
                    onTouchEvent(motionEvent : MotionEvent):Boolean

    3、View
                   dispatchTouchEvent(motionEvent:MotionEvent):Boolean
                   onTouchEvent(motionEvent:MotionEvent):Boolean

    方法用途解析

    这三个方法的返回值都是boolean类型,其实就是通过返回值来决定下一步传递处理方向。

    1、dispatchTouchEvent()                   -------用来事件分发所用
                该方法会将根元素的事件自上而下依次分发到内层子元素中,直到被终止(返回true)或到达最里层元素。在其中会调用onInterceptTouchEvent()和onTouchEvent()方法。
               返回false不拦截继续向下分发,如果返回true则拦截该事件不在向下层元素分发,在dispatchTouchEvent()中默认返回false。

    2、onInterceptTouchEvent()              ------- 用来拦截事件所用
               该方法在ViewGroup源代码中实现就是返回false不拦截事件,Touch事件就会往下传递给其子View。
               如果我们重写该方法并且将其返回true,该事件就会被拦截,并且被当前ViewGroup处理,调用该类的onTouchEvent()方法。

    3、onTouchEvent()                            ------ 用来处理事件所用
                返回true则表示该View处理该事件,事件将终止向上传递(传递给其父View)
                返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理。

    总结

    1、这些事件将会由上而下逐层传递,直到传递到最低层的View元素,此时将会调用该View的onTouchEvent()方法来处理该事件;返回true表示对该事件已经处理成功,如果返回false则并没有成功处理该事件,将会把事件逐层向上传递,交给上层View的onTouchEvent()方法处理,以此类推,直至某一View成功处理该事件,或者到达顶层的View处理仍然返回false则放弃对该事件处理,事件消失。

    2、如果在事件向下传递的过程中,被中途拦截,也就是onInterceptTouchEvent()方法返回true,那么该事件将停止向下传递,并交给该层的onTouchEvent()方法处理,无论成功与否,低层View都将不再收到该事件。处理事件失败,将交由上层View的onTouchEvent()方法处理。

    3、dispatchTouchEvent()具有记忆功能,如果第一次 是啊金向下传递到某个View,它把事件继续传递给它的子View,它会记录该事件是否被它下面的View给成功处理了。(如果知道呢?如果该事件再次被传递到我的onTouchEvent()来处理,那就数明下面的子View都没能成功处理该是事件)。当第二次事件向下传递到该View,该View的dispatchTouchEvent()方法会判断,若上次事件由下面的View成功处理了,才会继续向下传递的交由下面的来处理。若没有处理成功,则直接调用自己的onTouchEvent()方法来处理该事件。

    4、记忆功能的信息只在一系列事件完成之前有效,如从ACTION_DOWN事件开始,直到后续事件ACTION_MOVE,ACTION_UP结束后,“记忆”信息就会被清除。也就是说如果某View处理ACTION_DOWN事件失败了(onTouchEvent()返回false),那么后续的ACTION_MOVE,ACTION_UP都不会在传递给该View了。由其父View处理,在下一次发生ACTION_DOWN事件的时候还是会传递到该View。

    5、onInterceptTouchEvent有两个作用:其一是拦截Down事件的分发,其二是终止UP和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。

    相关文章

      网友评论

          本文标题:Android Touch事件分发机制

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