Android事件分发和消费机制总结
2014-08-15 14:20
204 查看
一次完整的触摸事件一般包括ACTION_DOWN、ACTION_MOVE、ACTION_UP和ACTION_CANCEL,每次触摸事件都是从ACTION_DOWN开始。
对事件的处理一般有分发(dispatchTouchEvent)、拦截(onInterceptTouchEvent)和响应(onTouchEvent)。
能处理事件的类一般有Activity、ViewGroup和View,其中Activity没有onInterceptTouchEvent方法。
为了便于理解,我们假设一个Activity布局中包含多个ViewGroup,每个ViewGroup中又包含多个View。当我们触摸屏幕时,事件的分发机制如下:
1. 最先触发Activity的dispatchTouchEvent(),在该方法中会调用onTouchEvent(),onTouchEvent()的返回值决定事件是否被消费。
1.1 返回false(默认值),表示ACTION_DOWN事件未被消费,进入步骤2,向触摸命中的ViewGroup传递事件;
1.2 返回true,表示ACTION_DOWN事件被消费,不再分发到下一层,后续的ACTION_MOVE和ACTION_UP则会逐层下发到该层的onTouchEvent()中进行处理(若后续事件被某一层拦截,则会返回ACTION_CANCEL给该层);
2. 传递到命中ViewGroup的dispatchTouchEvent(),在该方法中会调用onInterceptTouchEvent(),onInterceptTouchEvent()的返回值决定事件是否被拦截。
2.1 返回false(默认值),表示ACTION_DOWN事件未被拦截,进入步骤3,向触摸命中的View传递事件;
2.2 返回true,表示ACTION_DOWN事件被拦截,交由本ViewGroup的onTouchEvent()来处理,处理的返回值决定事件是否被消费(事件是否被消费的后续处理参考1);
3. 传递到命中View的dispatchTouchEvent(),在该方法中的处理流程如下:
3.1 判断【控件是否绑定touch事件 && 控件是否Enable && onTouch()返回值】,若判断通过则返回true(事件在onTouch()中处理掉),否则进入3.2;
3.2 调用onTouchEvent()处理事件,若处理完返回true,则dispatchTouchEvent()也返回true,否则进入3.3;
3.3 返回false,事件向上逐层传递,直到有一层消费ACTION_DOWN事件,若没有任何一层消费该事件,则本次触摸事件被视为取消;
以下是来自 http://www.eoeandroid.com/thread-319301-1-1.html 的图片,可以有助于大家的理解。(在此感谢原作者!)
附图1:ACTION_DOWN未被消费的情况
附图2:ACTION_DOWN被命中的View消费,后续的ACTION_MOVE、ACTION_DOWN事件都会传递到该View的onTouchEvent()方法进行处理
附图3:ACTION_DOWN被命中的View消费,但是后续事件被上层拦截的情况
附图4:ACTION_DOWN被上层拦截的情况
对事件的处理一般有分发(dispatchTouchEvent)、拦截(onInterceptTouchEvent)和响应(onTouchEvent)。
能处理事件的类一般有Activity、ViewGroup和View,其中Activity没有onInterceptTouchEvent方法。
为了便于理解,我们假设一个Activity布局中包含多个ViewGroup,每个ViewGroup中又包含多个View。当我们触摸屏幕时,事件的分发机制如下:
1. 最先触发Activity的dispatchTouchEvent(),在该方法中会调用onTouchEvent(),onTouchEvent()的返回值决定事件是否被消费。
1.1 返回false(默认值),表示ACTION_DOWN事件未被消费,进入步骤2,向触摸命中的ViewGroup传递事件;
1.2 返回true,表示ACTION_DOWN事件被消费,不再分发到下一层,后续的ACTION_MOVE和ACTION_UP则会逐层下发到该层的onTouchEvent()中进行处理(若后续事件被某一层拦截,则会返回ACTION_CANCEL给该层);
2. 传递到命中ViewGroup的dispatchTouchEvent(),在该方法中会调用onInterceptTouchEvent(),onInterceptTouchEvent()的返回值决定事件是否被拦截。
2.1 返回false(默认值),表示ACTION_DOWN事件未被拦截,进入步骤3,向触摸命中的View传递事件;
2.2 返回true,表示ACTION_DOWN事件被拦截,交由本ViewGroup的onTouchEvent()来处理,处理的返回值决定事件是否被消费(事件是否被消费的后续处理参考1);
3. 传递到命中View的dispatchTouchEvent(),在该方法中的处理流程如下:
3.1 判断【控件是否绑定touch事件 && 控件是否Enable && onTouch()返回值】,若判断通过则返回true(事件在onTouch()中处理掉),否则进入3.2;
3.2 调用onTouchEvent()处理事件,若处理完返回true,则dispatchTouchEvent()也返回true,否则进入3.3;
3.3 返回false,事件向上逐层传递,直到有一层消费ACTION_DOWN事件,若没有任何一层消费该事件,则本次触摸事件被视为取消;
以下是来自 http://www.eoeandroid.com/thread-319301-1-1.html 的图片,可以有助于大家的理解。(在此感谢原作者!)
附图1:ACTION_DOWN未被消费的情况
附图2:ACTION_DOWN被命中的View消费,后续的ACTION_MOVE、ACTION_DOWN事件都会传递到该View的onTouchEvent()方法进行处理
附图3:ACTION_DOWN被命中的View消费,但是后续事件被上层拦截的情况
附图4:ACTION_DOWN被上层拦截的情况
相关文章推荐
- Android总结02_Touch事件的分发与消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- android事件分发机制总结
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制(一)
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制