У меня есть фрагмент карты Google в верхней части диалогового окна нижнего листа. Я отключил перетаскиваемое сенсорное действие в поведении нижнего листа, чтобы я мог управлять картой. Проблема в том, что я не могу прокручивать карту, используя сенсорные действия вверх или вниз, потому что перетаскивание моего нижнего листа отключено. Я думал отключить сенсорное действие поведения нижнего листа, когда пользователь касается карты, но я не знаю, как это сделать. Как я могу это исправить?
Карта Google Touch в диалоговом окне нижнего листа
Ответы (2)
Попробуйте добавить nestedScrollingEnabled="true"
в макет нижнего листа:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="true"
app:behavior_hideable="true"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
У меня есть BottomSheetDialogFragment
(родительский View
), который содержит SupportMapFragment
(дочерний View
). Панорамирование карты работает только для горизонтальных жестов. Как уже упоминалось OP, это связано с тем, что события касания BottomSheet
и Map
конфликтуют, когда речь идет о вертикальных жестах.
Вот как я справился с этим. Мой BottomSheetDialogFragment
реализует OnMapReadyCallback
и GoogleMap.OnCameraMoveStartedListener
.
override fun onMapReady(p0: GoogleMap) {
p0.setOnCameraMoveStartedListener(this)
}
override fun onCameraMoveStarted(reason: Int) {
when(reason) {
GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE -> {
// The user gestured on the map
childView?.parent?.requestDisallowInterceptTouchEvent(true)
}
GoogleMap.OnCameraMoveStartedListener.REASON_API_ANIMATION -> {
// The user tapped something on the map
childView?.parent?.requestDisallowInterceptTouchEvent(true)
}
GoogleMap.OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION -> {
// The app moved the camera
childView?.parent?.requestDisallowInterceptTouchEvent(true)
}
}
}
Если установлено значение true
, requestDisallowInterceptTouchEvent()
не позволяет родительскому элементу View
перехватывать сенсорные события дочернего элемента View
. Теперь я могу увеличивать/уменьшать масштаб карты (горизонтальные и вертикальные жесты) во фрагменте диалога нижнего листа.