文章目录
- 一、内部拦截法(Inner Intercept)
- 1.1 工作原理:
- 1.2 实现步骤:
- 1.3 适用场景:
- 1.4 内部拦截法示例
- 1.4.1. 自定义 `RecyclerView` 以处理内部拦截
- 1.4.2. 在布局中使用 `InterceptableRecyclerView`
- 1.5 为什么`requestDisallowInterceptTouchEvent(boolean disallowIntercept)` 方法可以实现通知父视图是否允许拦截触摸事件
- 1.5.1 事件分发机制简述
- 1.5.2 `requestDisallowInterceptTouchEvent` 的作用
- 1.5.3 源码分析
- 1.5.3.1 `ViewGroup` 中的实现
- 1.5.3.2 子视图调用时的效果
- 1.5.3 总结
- 二、外部拦截法(Outer Intercept)
- 2.1 工作原理:
- 2.2 实现步骤:
- 2.3 适用场景:
- 2.4 外部拦截法示例
- 2.4.1. 自定义 `HorizontalScrollView` 以处理外部拦截
- 2.4.2. 在布局中使用 `InterceptableHorizontalScrollView`
- 三、总结
当涉及处理 Android 应用中的事件冲突时,通常会采用
内部拦截法和
外部拦截法这两种主要的解决方案。
这两种方法都旨在解决多个视图(View)之间因为处理触摸事件而可能发生的冲突,例如滑动冲突或者嵌套视图中的触摸事件传递问题。
一、内部拦截法(Inner Intercept)
内部拦截法是指事件首先传递给子 View,只有当子 View 需要父容器干预时才请求父容器拦截事件。
1.1 工作原理:
- 触摸事件首先传递到
子 View。 子 View在其onTouchEvent()或dispatchTouchEvent()中处理事件,并根据逻辑决定是否让父容器进行处理。子 View可以通过调用requestDisallowInterceptTouchEvent(false)来允许父容器拦截事件。
1.2 实现步骤:
-
子 View 处理事件:在子 View 的
onTouchEvent()或dispatchTouchEvent()中处理事件。
