View事件分发机制

来源:互联网 发布:淘宝nike专卖店 编辑:程序博客网 时间:2024/06/05 19:04

最近重新整理了一遍View的事件分发机制。这里记录一下。

首先,要明确,事件分发有两个主角:ViewGroup 和 View。

其次,涉及的方法有三个:dispatchTouchEvent,onInterceptTouchEvent(只有ViewGroup会涉及这个方法),onTouchEvent。

*dispatchTouchEvent:用于分发事件。返回值是布尔类型,返回true,就不再往下分发事件;返回false,就往下分发事件。

*onInterceptTouchEvent:用于拦截事件。返回值是布尔类型,返回true,就表示拦截事件,由ViewGroup自己处理;返回false,就表示不拦截,事件向下传递。(另外一种说法是:1.用于拦截down事件的分发;2.中止up 和 move事件向目标View传递,使得目标View所在的ViewGroup捕获up 和 move事件。)

*onTouchEvent:用于处理事件。返回值决定了控件是否消费此次事件。尤其是对于ACTION_DOWN事件,返回true,就表示控件消费了此次事件,会继续处理后续事件;返回false,就表示控件不关心此次事件,返回并交给父控件处理。

注:消费不消费有什么区别呢?这是我之前一直很懵逼的地方,区别大了。ACTION_MOVE 和 ACTION_UP事件发生的前提是已经发生过ACTION_DOWN事件,如果ACTION_DOWN事件未被消费,系统就会认为ACTION_DOWN没有发生过,这样ACTION_MOVE 和 ACTION_UP事件就不能被捕获到。

事件分发流程:

必须要有一个View树模型的概念。最顶层是Activity,一个点击事件到来之后,从最顶层开始,也就是从Activity的ViewGroup开始,依次往下传递,传递的过程是通过调用View(ViewGroup)的dispatchTouchEvent实现的。 ViewGroup会遍历内部的子View,通过自己的dispatchTouchEvent来调用每个子View的dispatchTouchEvent方法。这样,事件就一层层传递下来了。传递的目的是找到真正需要处理此次事件的View。

后面再结合源码来具体分析一下。

原创粉丝点击