在安卓开发中会时常碰到滑动冲突的情况,比如有一个水平滑动的 ViewPager 里面有 Fragment, Fragment 里面有水平滑动的 ViewGroup,当你的手指在屏幕水平滑动时,就会发生冲突,那怎么 解决这种冲突呢,首先开发者需要对 Activity、ViewGroup、View 的事件传递机制有个很好的认识。
触摸事件对应的是MotionEvent类,事件类型主要有三种:
一次屏幕触摸操作,一定会产生 ACTION_DOWN 和 ACTION_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,则
表示消费事件,继而向上层父视图传递事件,让父视图来处理。


