1.被分发的对象
被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按下、滑动、 抬起与取消。这些事件被封装成MotionEvent
对象。该对象中的主要事件如下表所示:
按下、滑动、抬起、取消这几种事件组成了一个事件流。事件流以按下为开始,中间可能有若干次滑 动,以抬起或取消作为结束。
2.分发事件的组件
分发事件的组件,也称为分发事件者,包括
Activity
、
View
和
ViewGroup
。它们三者的一般结构为:
从上图中可以看出,
Activity
包括了
ViewGroup
,
ViewGroup
又可以包含多个
View
。
3.分发的核心方法
负责对事件进行分发的方法主要有三个,分别是:
dispatchTouchEvent()
onTouchEvent()
onInterceptTouchEvent
()。
它们并不存在于所有负责分发的组件中,其具体情况总结于下面的表格中:
从表格中看,dispatchTouchEvent,onTouchEvent方法存在于上文的三个组件中。而 onInterceptTouchEvent为ViewGroup独有。这些方法的具体作用在下文作介绍。
4. 事件分发过程
向下传播:
Activity
包括
Layout
,事件从
Activity
向
Layout
传播被称作
’
向下传播
‘
。
Layout
包含若干
View
,事件从
Layout
向其子
View
传播,也被称为
’
向下传播
‘
。
向上传播:与
’
向下传播
‘
相反。
分发方法
dispatchTouchEvent
从方法的名称中可以看出该方法主要是负责分发,是安卓事件分发过程中的核心。事件是如何传递
的,主要就是看该方法,理解了这个方法,也就理解了安卓事件分发机制。
在了解该方法的核心机制之前,需要知道一个结论:
如果某个组件的该方法返回
TRUE,
则表示该组件已经对事件进行了处理,不用继续调用其余
组件的分发方法,即停止分发。
如果某个组件的该方法返回
FALSE,
则表示该组件不能对该事件进行处理,需要按照规则继续
分发事件。在不复写该方法的情况下,除了一些特殊的组件,其余组件都是默认返回
False
的。后续有例子说明。
ViewGroup
独有的
onInterceptTouchEvent
方法
ViewGroup
的该方法与
Activity
的类似,只是新添了一个
onInterceptTouchEvent
方法。当事件传 入时,首先会调用onInterceptTouchEvent
。
如果该方法返回了
FALSE
(表示不拦截),则交给子
View
去调用
dispatchTouchEvent
()方
法
如果该方法返回了TRUE
(表示拦截),则直接交给该
ViewGroup
对象的
onTouchEvent(ev)
方法处理,具体是否能处理以
onTouchEvent()
的实际情况为准。