如何让ViewPager2指定区域的触摸事件透传至下层视图?
我有一个包含底部弹窗(基于BottomSheetBehaviour实现)的ViewPager2,当底部弹窗折叠后,ViewPager2不会自适应调整高度以适配缩短后的内容。ViewPager2下方显示着一个基于MapBox MapView实现的地图。
由于描述略显模糊,我已准备好最小可复现示例用于说明问题。要让MapBox显示地图,你需要分别在gradle.properties和strings.xml文件中填入你的密钥/公钥。即使不填,你也可以通过查看MapView左上角的比例尺来理解我的需求。
当底部弹窗折叠后,原底部弹窗占据的、现在变为透明的区域不再处理用户交互,而是将触摸事件传递给下方的FragmentContainerView。
当底部弹窗折叠后,ViewPager2的高度保持不变,因此上述区域内的触摸事件仍会被ViewPager2正常处理,但从直观逻辑来说,这些事件应该由下方可见的MapView处理。你可以在该区域拖动或捏合屏幕来感受问题。

让ViewPager2动态“包裹内容”
ViewPager2本身并不支持此功能。
或许可以获取ViewPager2中每个Fragment展开和折叠后的高度,然后在Fragment/页面切换、底部弹窗展开/折叠时重置ViewPager2的高度,但这需要频繁调用requestLayout(),会导致UI闪烁并干扰动画效果。
处理触摸事件
我尝试了以下代码,但似乎ViewPager2需要注册触摸事件,因为尝试滑动到下一页时应用崩溃了。不过我对触摸事件处理和ViewPager2的实现不太熟悉,并未深入研究,欢迎对此方案的可行性提供意见。
viewPager2[position].setOnTouchListener { v, event -> // If background is collapsed, allow touch events to pass through transparent space in ViewPager2 if (event.y < bottomSheetBehavior.peekHeight && isBottomSheetCollapsed) { false // Else, handle them as per normal } else { when (event.action) { ACTION_DOWN -> v.performClick() } true } }
说明:
我还希望底部弹窗能像ViewPager一样滑动切换页面,这也是我将底部弹窗放在ViewPager2中的原因,类似Citymapper的实现方式。
内容的提问来源于stack exchange,提问作者Samuel Ho

