美文网首页
说说View的事件分发机制

说说View的事件分发机制

作者: 古早味蛋糕 | 来源:发表于2019-07-06 16:47 被阅读0次

View事件分发机制是view的一个核心知识点,不少初学者甚至中级开发者面对这个问题时都会觉得困惑。View的另一大难题滑动冲突,它的解决方法的理论基础就是事件分发机制,因此掌握好View的事件分发机制是十分重要的。
1.点击事件的传递
首先我们要明白这里要分析的对象就是MotionEvent,即点击事件,关于MotionEvent如果不了解可以从网上查询一下,所谓的点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是分发过程。
2.点击事件分发的过程
点击事件的分发过程由三个很重要的方法共同完成的:dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()


1.1.1.png

上述三个方法到底有什么区别呢?它们是什么关系呢?其实它们的关系可以用如下伪代码表示:

   public boolean dispathTouchEvent(MotionEvent ev){
    boolean consume =false;
    if (onInterceptTouchEvent(ev)){
        consume=onTouchEvent(ev);
    }else{
        consume=child.dispathTouchEvent(dv);
    }
        return consume;
}

上述伪代码已经将三者的关系表现的淋漓尽致。通过上面的伪代码,我们也可以大概的了解点击事件的传递规则:对于一个根ViewGroup来说,点击事件产生后,首先会传递给它,这时它的dispathTouchEvent就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispathTouchEvent方法就会被调用,如此反复直到事件被最终处理。

3.点击事件具体的代码执行过程
当一个View需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的OnTouch方法会被回调。这时事件如何处理还要看OnTouch的返回值,如果返回false。则当前View的onTouchEvent方法会被调用;如果返回true,那么onTouchEvent方法将不会被调用。由此可见,给View设置的OnTouchListener,其优先级比onTouchEvent要高。在onTouchEvent方法中, 如果当前设置的有OnClickListener,那么它的onClick方法会被调用。可以看出,平时我们常用的OnClickListener,其段先级最低,处于事件传递的尾端。

4.点击事件传递顺序遵循如下:
当一个点击事件产生后。它的传递过程顺序:Activity->Window->View,即事件总是先传递给Window,最后Window再传递给顶级View。顶级View接收到事件后,就会按照事件分发机制去分发事件。

相关文章

网友评论

      本文标题:说说View的事件分发机制

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