Android 嵌套触摸处理

Posted

技术标签:

【中文标题】Android 嵌套触摸处理【英文标题】:Android nested touch handling 【发布时间】:2016-09-20 00:38:26 【问题描述】:

我在自定义寻呼机中有一个 ViewPager。两者都在水平方向滑动。据我了解 android 触摸模型,我的自定义寻呼机应该监视通过 onInterceptTouchEvent 的触摸事件,检查滑动手势并在检测到时拦截,但也尊重 requestDisallowInterceptTouchEvent 以便如果子视图应该使用相同的水平滑动手势我的自定义视图正在监视它是允许的。

到目前为止一切都很好,我的自定义寻呼机可以很好地处理非滚动或垂直滚动​​子视图和水平滚动子视图的水平滑动,尊重禁止请求,因此子视图可以使用水平手势。

但是,如果水平滚动的子视图已到达其内容的末尾,因此无法再滚动,我希望它取消其禁止请求,以便父级可以拦截并使用该动作,但通过阅读源(https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/view/ViewPager.java,https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ScrollView.java),我看不到它曾经用错误的参数调用 requestDisallowInterceptTouchEvent,这意味着一旦它识别出一个手势为滑动,它就会消耗它,不管它是否真的可以使用它。

是我对 Android 的触摸处理系统的理解有缺陷,还是标准视图类的触摸处理在这方面过于粗糙?

这是一个提高我对 Android 的触摸处理模型的理解的问题,以便我可以更好地系统一起工作,而不是请求解决方法建议(尽管如果答案是权威的“系统不允许这个”,对于那些有类似问题并在搜索时发现这个问题的人来说,可能会欢迎好的解决方法)

【问题讨论】:

【参考方案1】:

你看过ViewGroup.onNestedFling()吗?

其文档的相关摘录:

如果一个嵌套的滚动子视图通常会翻转,但它位于其自身内容的边缘,它可以使用此方法将翻转委托给它的嵌套滚动父视图。

【讨论】:

以上是关于Android 嵌套触摸处理的主要内容,如果未能解决你的问题,请参考以下文章

Android 嵌套滑动——NestedScrolling完全解析

Android中不同方向嵌套滑动的解决方式(ListView为样例)

10分钟了解Android的事件分发

Android触摸事件分发机制完全解析《一》

Android输入系统——多点触摸处理

Android触摸事件-TouchEventHelper