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