上篇文章《View体系(三)初探View事件分发机制》对View的事件分发机制进行了粗略的讲解,并用代码实际探究了View事件的传递和处理过程。这篇文章就对View的事件分发机制进行一个更深入的讲解。
之前提到过事件分发机制中的三个方法:dispatchTouchEvent(MotionEvent event)、onInterceptTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent event),那么这三个方法到底有什么样的关联呢?他们的关系其实可以用如下的伪代码表示:
public boolean dispatchTouchEvent(MotionEvent event) {
boolean result = false;
if (onInterceptTouchEvent(event)) {
result = onTouchEvent(event);
} else {
result = child.dispatchTouchEvent(event);
}
return result;
}
事件由上到下的传递规则
对于根ViewGroup,事件首先传递给它的dispatchTouchEvent()方法,如果该ViewGroup的onInterceptTouchEvent()方法返回true,则表示它要拦截这个事件,这个事件就会交给它的onTouchEvent()方法处理,如果onInterceptTouchEvent()方法返回false,则表示它不拦截这个事件,则交给它的子元素的dispatchTouchEvent()来处理,如此的反复下去。如果传递给最底层的View,View是没有子View的,就会调用View的dispatchTouchEvent()方法,一般情况下最终会调用View的onTouchEvent()方法。
类比生活中的场景:假如你只是公司的基层员工(View),部门经理(父ViewGroup)通常会将事情(MotionEvent)安排给项目经理(子ViewGroup),项目经理再将事情安排给你。如果项目经理觉得他自己就能处理部门经理安排的事情,他就会把事情拦截(onInterceptTouchEvent),然后自己处理(onTouchEvent),不再安排给你处理。
事件由下而上的传递规则
事件传给最底层的View,如果他的onTouchEvent()方法返回true,则事件由最底层的View处理并消耗了,如果返回false则表示该View不消耗此次事件,则继续向上传递给父View的onTouchEvent()处理,如果父View的onTouchEvent()仍旧返回false,则继续向上传递给该父View的父View的onTouchEvent()处理,如此的反复下去。
同样类比上述场景:你把事情处理好了(onTouchEvent返回true),那么事情就完结了;如果你处理不了(onTouchEvent返回false),就需要上交给项目经理处理(传递给子ViewGroup的onTouchEvent),如果项目经理也处理不了,就需要再向上交给部门经理处理(传递给父ViewGroup的onTouchEvent)。










