您的位置:首页 > 移动开发 > Android开发

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被上层拦截的情况

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息