在安卓开发中会时常碰到滑动冲突的情况,比如有一个水平滑动的 ViewPager 里面有 Fragment,
Fragment 里面有水平滑动的 ViewGroup,当你的手指在屏幕水平滑动时,就会发生冲突,那怎么
解决这种冲突呢,首先开发者需要对 Activity、ViewGroup、View 的事件传递机制有个很好的认识。

触摸事件的类型

触摸事件对应的是MotionEvent类,事件类型主要有三种:
- ACTION_DOWN: 用户手指按下屏幕,标志着一次触摸事件开始。
- ACTION_MOVE: 用户手指按下屏幕之后,在松开之前,如果滑动的距离超过了一定值,则会
被判定为 ACITON_MOVE 操作。
- ACTION_UP: 用户手指离开屏幕,标志着一次完整触摸事件结束。

一次屏幕触摸操作,一定会产生 ACTION_DOWNACTION_UP 两种事件,如果用户按下
之后手指右移动一定的距离,则会发生 ACTION_MOVE 事件,如果只是点了一下,那么则不
会发生。

触摸事件传递

触摸事件的传递有三个阶段:

  • 分发(dispatch): 所有的事件都是通过这个方法分发,对应的方法原型为
    public boolean dispatchTouchEvent(MotionEvent event)
    如果方法返回true,则当前视图消费事件,不在分发,super.dispatchTouchEvent 表示继续
    分发事件,如果当前视图是 ViewGroup,则会调用 interceptTouchEvent

  • 拦截(intercept): 这个方法中 ViewGroup 中,顾名思义,就是对触摸事件的拦截,方法原型为
    public boolean onInterceptHoverEvent(MotionEvent event)

  • 消费(consume: 事件最终需要被消费,对应的方法原型为
    public boolean onTouchEvent(MotionEvent event)
    如果方法返回 true,则说明当前视图可以消费事件,不会再向上传递事件;返回值为 false,则
    表示消费事件,继而向上层父视图传递事件,让父视图来处理。

触摸事件传递的三个角色:

  • Activity: 拥有 dispatchTouchEvent 和 onTouchEvent 两个方法。
  • ViewGroup: 拥有 dispatchTouchEvent 、onInterceptTouchEvent 和 onTouchEvent 三个方法。
  • View: 拥有 dispatchTouchEvnet 和 onTouchEvent 两个方法。

触摸事件传递三种类型

  • View 不消费事件
    DOWN 事件不消费,onTouchEvnet 返回 false,父视图 onTouchEvent 方法执行,接下来的
    MOVE、UP 事件也不会再传递给该 View,而是由消费了 DOWN 事件的父视图接收

  • View 消费事件
    View 消费了 DOWN 事件,onTouchEvent 返回 true,父视图的 onTouchEvent 方法不会被执行,
    接下来的 MOVE、UP 事件继续传递给该 View,除非传递过程被拦截

![View 消费事件](https://charmingw.github.io/images/MotionEvent_interested _view.png)

  • 事件被拦截
    DOWN 事件被 View 消费了,但接下来的 MOVE、up 事件被拦截了,所以 View 无法消费整套触摸事件

更多相关文章

  1. vue H5与(Android、iOS)原生APP交互
  2. 通用代码库之listview和GridView
  3. Android(安卓)IjkMediaPlayer编译支持RTSP播放,降低延时500ms左右
  4. Android官方教程翻译(3)——创建一个简单的用户界面
  5. Android获取手机号码和运营商信息的方法
  6. [置顶] Android(安卓)经典面试题整理(一)(附答案)
  7. Android(安卓)简单音乐播放器开发
  8. android应用:startActivityForResult使用实例
  9. 做谷歌地图是获得Map key的方法

随机推荐

  1. Android-如何稳定获取IMEI1、IMEI2、MEID
  2. Android实现短信验证功能(使用前的准备)
  3. android窗体动画:activity启动从底部向上
  4. Android卸载程序之后跳转到指定的反馈页
  5. Android指纹支付 - android M / P 全适配
  6. 在android开发中应该如何管理内存或者是
  7. Android(安卓)笔记 :Android(安卓)热修复
  8. android使用Fragment实现底部菜单使用sho
  9. Android(安卓)双进程守护
  10. 基于Android(安卓)RIL层实现来电拦截的技