这里 SDK Android 根据布局更改调整大小
Here SDK Android resize on layout changes
我们很难在 Android.
上顺利调整此处 SDK 地图的大小
我们要平滑调整地图大小到sheetcollapse
和hidden
状态如图
但如您所见,它并没有真正调整大小,而是跳转到新位置,同时地图保持其尺寸并且不缩放。
这就是我们所做的:
...
<com.here.sdk.mapview.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/nine_grid_unit" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/menuBottomSheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:clickable="true"
android:elevation="@dimen/four_grid_unit"
android:focusable="true"
app:behavior_hideable="true"
app:behavior_peekHeight="@dimen/thirtytwo_grid_unit"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
<View
android:id="@+id/tap_stop"
android:layout_width="@dimen/nine_grid_unit"
android:layout_height="@dimen/one_grid_unit"
android:layout_marginTop="@dimen/one_grid_unit"
android:background="@color/grey_light"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<edeka.digital.app.widget.SegmentedControlView
android:id="@+id/tabSwitchSegmentedControl"
android:layout_width="@dimen/thirtyfive_grid_unit"
android:layout_height="wrap_content"
android:paddingStart="@dimen/three_grid_unit"
android:paddingEnd="@dimen/three_grid_unit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tap_stop"
app:segmentCount="2"
app:segmentTitles="@array/segment_titles_shop_search" />
</androidx.constraintlayout.widget.ConstraintLayout>
...
和代码:
val bottomBehavior = BottomSheetBehavior.from(binding.menuBottomSheet)
bottomBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
val mapView = binding.map
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
bottomSheetBehaviorObservable.onNext(newState)
when (newState) {
BottomSheetBehavior.STATE_COLLAPSED -> {
mapView.bottom = binding.menuBottomSheet.top
mapView.invalidate()
}
BottomSheetBehavior.STATE_HIDDEN -> {
mapView.bottom = binding.menuBottomSheet.top
mapView.invalidate()
}
else -> { /* void */
}
}
}
})
我希望有某种 resize() 函数,或者如果布局尺寸发生变化,它会自行布局。
我们真正想要的已经在HERE WeGo App中实现了。如果用户滑动底部 sheet:
,整个地图会缩放(包括这里的徽标)
谁能帮帮我们?
1中显示的演示可以在这里找到:
您的地图视图似乎被滑动面板覆盖,并且在滑动动画期间没有重绘。它仅在状态更改时呈现。您可以尝试在 onSlide
方法中添加 mapView.invalidate()
,如下所示:
override fun onSlide(bottomSheet: View, slideOffset: Float) {
mapView.invalidate()
}
但是,为了确定这是否是真正的原因,我需要获取并构建您的代码。
我能够得到你的代码,编译并重现错误。我找到了两个选项来解决这个问题,都在模拟器和真实设备上进行了测试。
将状态更改处理代码中的代码复制到 onSlide
方法中:
override fun onSlide(bottomSheet: View, slideOffset: Float) {
mapView.bottom = binding.menuBottomSheet.top
mapView.invalidate()
}
完全删除地图视图大小调整和无效代码。它基本上使整个 setupBottomSheet
方法变得多余。地图视图无需调整大小即可正常工作,这是一种更可取的修复方法,因为它涉及的代码和操作更少。
我发现实现它的最佳解决方案是添加一个新方法:
private fun updateMapView(bottomSheetTop: Int) {
val mapView = binding.map
val principalY = Math.min(bottomSheetTop / 2.0, mapView.height / 2.0)
mapView.camera.principalPoint = Point2D(mapView.width / 2.0, principalY)
val logoMargin = Math.max(0, mapView.bottom - bottomSheetTop)
mapView.setWatermarkPosition(WatermarkPlacement.BOTTOM_CENTER, logoMargin.toLong())
}
并在 onSlide
和 onStateChanged
中这样调用它:
updateMapView(bottomSheet.top)
请注意,您需要在底部中心位置放置 HERE 徽标,否则无法使用可调整的边距。
我也尝试调整地图视图的大小,但结果并不令人满意。如果你想试一试,这里是代码:
private fun updateMapView(bottomSheetTop: Int) {
val mapView = binding.map
mapView.layoutParams.height = bottomSheetTop
mapView.requestLayout()
}
我们很难在 Android.
上顺利调整此处 SDK 地图的大小我们要平滑调整地图大小到sheetcollapse
和hidden
状态如图
但如您所见,它并没有真正调整大小,而是跳转到新位置,同时地图保持其尺寸并且不缩放。
这就是我们所做的:
...
<com.here.sdk.mapview.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/nine_grid_unit" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/menuBottomSheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:clickable="true"
android:elevation="@dimen/four_grid_unit"
android:focusable="true"
app:behavior_hideable="true"
app:behavior_peekHeight="@dimen/thirtytwo_grid_unit"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
<View
android:id="@+id/tap_stop"
android:layout_width="@dimen/nine_grid_unit"
android:layout_height="@dimen/one_grid_unit"
android:layout_marginTop="@dimen/one_grid_unit"
android:background="@color/grey_light"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<edeka.digital.app.widget.SegmentedControlView
android:id="@+id/tabSwitchSegmentedControl"
android:layout_width="@dimen/thirtyfive_grid_unit"
android:layout_height="wrap_content"
android:paddingStart="@dimen/three_grid_unit"
android:paddingEnd="@dimen/three_grid_unit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tap_stop"
app:segmentCount="2"
app:segmentTitles="@array/segment_titles_shop_search" />
</androidx.constraintlayout.widget.ConstraintLayout>
...
和代码:
val bottomBehavior = BottomSheetBehavior.from(binding.menuBottomSheet)
bottomBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
val mapView = binding.map
override fun onSlide(bottomSheet: View, slideOffset: Float) {
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
bottomSheetBehaviorObservable.onNext(newState)
when (newState) {
BottomSheetBehavior.STATE_COLLAPSED -> {
mapView.bottom = binding.menuBottomSheet.top
mapView.invalidate()
}
BottomSheetBehavior.STATE_HIDDEN -> {
mapView.bottom = binding.menuBottomSheet.top
mapView.invalidate()
}
else -> { /* void */
}
}
}
})
我希望有某种 resize() 函数,或者如果布局尺寸发生变化,它会自行布局。
我们真正想要的已经在HERE WeGo App中实现了。如果用户滑动底部 sheet:
,整个地图会缩放(包括这里的徽标)谁能帮帮我们?
1中显示的演示可以在这里找到:
您的地图视图似乎被滑动面板覆盖,并且在滑动动画期间没有重绘。它仅在状态更改时呈现。您可以尝试在 onSlide
方法中添加 mapView.invalidate()
,如下所示:
override fun onSlide(bottomSheet: View, slideOffset: Float) {
mapView.invalidate()
}
但是,为了确定这是否是真正的原因,我需要获取并构建您的代码。
我能够得到你的代码,编译并重现错误。我找到了两个选项来解决这个问题,都在模拟器和真实设备上进行了测试。
将状态更改处理代码中的代码复制到
onSlide
方法中:override fun onSlide(bottomSheet: View, slideOffset: Float) { mapView.bottom = binding.menuBottomSheet.top mapView.invalidate() }
完全删除地图视图大小调整和无效代码。它基本上使整个
setupBottomSheet
方法变得多余。地图视图无需调整大小即可正常工作,这是一种更可取的修复方法,因为它涉及的代码和操作更少。
我发现实现它的最佳解决方案是添加一个新方法:
private fun updateMapView(bottomSheetTop: Int) {
val mapView = binding.map
val principalY = Math.min(bottomSheetTop / 2.0, mapView.height / 2.0)
mapView.camera.principalPoint = Point2D(mapView.width / 2.0, principalY)
val logoMargin = Math.max(0, mapView.bottom - bottomSheetTop)
mapView.setWatermarkPosition(WatermarkPlacement.BOTTOM_CENTER, logoMargin.toLong())
}
并在 onSlide
和 onStateChanged
中这样调用它:
updateMapView(bottomSheet.top)
请注意,您需要在底部中心位置放置 HERE 徽标,否则无法使用可调整的边距。
我也尝试调整地图视图的大小,但结果并不令人满意。如果你想试一试,这里是代码:
private fun updateMapView(bottomSheetTop: Int) {
val mapView = binding.map
mapView.layoutParams.height = bottomSheetTop
mapView.requestLayout()
}