事件构成
在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作。所有这些都构成了Android中的事件响应。总的来说,所有的事件都由如下三个部分作为基础:
- 按下(ACTION_DOWN)
- 移动(ACTION_MOVE)
- 抬起(ACTION_UP)
所有的操作事件首先必须执行的是按下操作(ACTION_DOWN)。
Android事件分发机制
Android事件分发是先传递到ViewGroup
,再由ViewGroup
传递到View
的。
对于View:
大体流程:触摸动作发生 => 调用dispatchTouchEvent
方法 => 首先调用onTouch
方法
若同时满足:绑定了OnClickListener
、控件可用(enabled
)、onTouch
方法返回true
,则dispatchTouchEvent
方法将直接返回true
,不会调用onTouchEvent
方法。
这是最新的代码:
|
|
否则,将会继续调用onTouchEvent
方法。并且可以推断,onClick
方法也是在onTouchEvent
方法中调用的。
对于ViewGroup
- Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
- 在ViewGroup中可以通过
onInterceptTouchEvent
方法对事件传递进行拦截,onInterceptTouchEvent
方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。 - 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
总结
- Android中事件按照从上到下的顺序进行层级传递,事件处理从Activity开始到ViewGroup再到View
- 事件传递方法包括
dispatchTouchEvent
、onTouchEvent
、onInterceptTouchEvent
,其中前两个是View
和ViewGroup
都有的,最后一个是只有ViewGroup才有的方法。这三个方法的作用分别是负责事件分发、事件处理、事件拦截 onTouch
事件要先于onClick
事件执行,onTouch
在事件分发方法dispatchTouchEvent
中调用,而onClick
在事件处理方法onTouchEvent
中被调用,onTouchEvent
要后于dispatchTouchEvent
方法的调用