如何为 Google 中的地图片段制作动画 Maps API for Android
How to animate the map fragment in Google Maps API for Android
我正在开发一个使用 Google 地图 API 用于 Android 的应用程序。我想为 Android 创建类似于 Google 地图应用程序的动画效果,它使地图片段保持在底部 sheet 上方,无论其状态如何。效果如下:
我尝试了给定 here 的 Map.setPadding()
将地图组件移动到底部 sheet 上方(通过计算底部 sheet 在 运行-time 并将其作为参数传递给上述方法),然后使用 ViewGroup.invalidate()
和 ViewGroup.requestLayout()
刷新布局,但我无法生成像 Google 地图应用程序那样流畅的效果。我想到的另一个解决方案是使用 Activity Transition 但不知道如何在 Fragments 中实现它。请帮忙。提前致谢!:)
我自己想出来了。这很简单。如果您使用 BottomSheetBehavior
for Android 来实现底部 sheet,那么在其 onStateChanged()
方法中,您可以为 Google 地图执行相机动画。它是在底部状态 sheet 借助 CameraUpdateFactory.scrollBy(float, float)
改变后执行的相机动画,允许您在 x 和 y 轴上移动相机位置。可以找到更多详细信息 here.
我只是更改垂直 y 轴,因为我希望地图垂直移动(或调整)并将其传递给 mMap.animateCamera()
方法。 bs_height
是我在 运行 时计算的底部 sheet 的高度。
以下片段显示了如何:
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
switch (newState) {
case BottomSheetBehavior.STATE_COLLAPSED :
collapsedStateAnimation();
mMap.animateCamera(CameraUpdateFactory.scrollBy(0.0f, bs_height - 200));
break;
case BottomSheetBehavior.STATE_DRAGGING :
...
break;
case BottomSheetBehavior.STATE_EXPANDED :
mMap.animateCamera(CameraUpdateFactory.scrollBy(0.0f, bs_height + 200));
break;
}
}
我正在开发一个使用 Google 地图 API 用于 Android 的应用程序。我想为 Android 创建类似于 Google 地图应用程序的动画效果,它使地图片段保持在底部 sheet 上方,无论其状态如何。效果如下:
我尝试了给定 here 的 Map.setPadding()
将地图组件移动到底部 sheet 上方(通过计算底部 sheet 在 运行-time 并将其作为参数传递给上述方法),然后使用 ViewGroup.invalidate()
和 ViewGroup.requestLayout()
刷新布局,但我无法生成像 Google 地图应用程序那样流畅的效果。我想到的另一个解决方案是使用 Activity Transition 但不知道如何在 Fragments 中实现它。请帮忙。提前致谢!:)
我自己想出来了。这很简单。如果您使用 BottomSheetBehavior
for Android 来实现底部 sheet,那么在其 onStateChanged()
方法中,您可以为 Google 地图执行相机动画。它是在底部状态 sheet 借助 CameraUpdateFactory.scrollBy(float, float)
改变后执行的相机动画,允许您在 x 和 y 轴上移动相机位置。可以找到更多详细信息 here.
我只是更改垂直 y 轴,因为我希望地图垂直移动(或调整)并将其传递给 mMap.animateCamera()
方法。 bs_height
是我在 运行 时计算的底部 sheet 的高度。
以下片段显示了如何:
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
switch (newState) {
case BottomSheetBehavior.STATE_COLLAPSED :
collapsedStateAnimation();
mMap.animateCamera(CameraUpdateFactory.scrollBy(0.0f, bs_height - 200));
break;
case BottomSheetBehavior.STATE_DRAGGING :
...
break;
case BottomSheetBehavior.STATE_EXPANDED :
mMap.animateCamera(CameraUpdateFactory.scrollBy(0.0f, bs_height + 200));
break;
}
}