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