事件构成
在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方法的调用