上篇文章《View体系(三)初探View事件分发机制》对View的事件分发机制进行了粗略的讲解,并用代码实际探究了View事件的传递和处理过程。这篇文章就对View的事件分发机制进行一个更深入的讲解。
之前提到过事件分发机制中的三个方法:dispatchTouchEvent(MotionEvent event)onInterceptTouchEvent(MotionEvent ev)onTouchEvent(MotionEvent event),那么这三个方法到底有什么样的关联呢?他们的关系其实可以用如下的伪代码表示:

1
2
3
4
5
6
7
8
9
public boolean dispatchTouchEvent(MotionEvent event) {
boolean result = false;
if (onInterceptTouchEvent(event)) {
result = onTouchEvent(event);
} else {
result = child.dispatchTouchEvent(event);
}
return result;
}

事件由上到下的传递规则

对于根ViewGroup,事件首先传递给它的dispatchTouchEvent()方法,如果该ViewGrouponInterceptTouchEvent()方法返回true,则表示它要拦截这个事件,这个事件就会交给它的onTouchEvent()方法处理,如果onInterceptTouchEvent()方法返回false,则表示它不拦截这个事件,则交给它的子元素的dispatchTouchEvent()来处理,如此的反复下去。如果传递给最底层的ViewView是没有子View的,就会调用ViewdispatchTouchEvent()方法,一般情况下最终会调用ViewonTouchEvent()方法。

类比生活中的场景:假如你只是公司的基层员工(View),部门经理(父ViewGroup)通常会将事情(MotionEvent)安排给项目经理(子ViewGroup),项目经理再将事情安排给你。如果项目经理觉得他自己就能处理部门经理安排的事情,他就会把事情拦截(onInterceptTouchEvent),然后自己处理(onTouchEvent),不再安排给你处理。

事件由下而上的传递规则

事件传给最底层的View,如果他的onTouchEvent()方法返回true,则事件由最底层的View处理并消耗了,如果返回false则表示该View不消耗此次事件,则继续向上传递给父ViewonTouchEvent()处理,如果父ViewonTouchEvent()仍旧返回false,则继续向上传递给该父View的父ViewonTouchEvent()处理,如此的反复下去。

同样类比上述场景:你把事情处理好了(onTouchEvent返回true),那么事情就完结了;如果你处理不了(onTouchEvent返回false),就需要上交给项目经理处理(传递给子ViewGrouponTouchEvent),如果项目经理也处理不了,就需要再向上交给部门经理处理(传递给父ViewGrouponTouchEvent)。

关注我