冲突情况
在 Android 开发中,滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比如 RecyclerView 嵌套 RecyclerView,直接通过相关方法禁掉内部 RecyclerView 的滑动;ScrollView 嵌套 RecyclerView 直接把 ScrollView 替换为 NestedScrollView 等等。
但我们今天要说的是在自定义 View 中遇到滑动冲突时,我们又应该如何处理呢?当然,今天的话题需要 View 的事件分发机制做理论前提。
1. 简单介绍 View 的事件分发机制
当然,这里也可以简单地提一下,基本的流程就是下面的伪代码。
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
当一个 ViewGroup 接收到一个事件的时候,首先会调用 dispatchTouchEvent
() 方法进行事件分发,如果 onInterceptTouchEvent
() 返回 true,则代表当前 View 会拦截事件,则直接回调 onTouchEvent
() 方法进行事件处理。
如果不拦截,则直接回调子 View 的 dispatchTouchEvent
() 方法。如此反复,一直到最里面的子 View。
当一个点击事件产生后,它的传递过程遵循以下顺序:Activity => Window => View
,即事件总是先传递给 Activity,Activity 再传递给 Window,最后 Window 再传递给顶层 DecorView,然后遵循上面的方式一直在最里层 View