如何在Jetpack Compose中为GoogleMap实现1000ms指定位置缩放动画
在Jetpack Compose GoogleMap中实现缩放动画
实现方法
在Jetpack Compose的GoogleMap中,你可以通过CameraPositionState的animate()方法实现相机动画,这个方法对应传统视图里的animateCamera(),但需要在协程环境中调用(用LaunchedEffect提供协程上下文)。
完整代码示例
替换你原有的代码,添加动画触发逻辑:
Column(...) { val destinationLatLng = LatLng(destination.lat, destination.lng) // 定义目标相机位置 val targetCameraPosition = CameraPosition.fromLatLngZoom(destinationLatLng, 15f) // 初始化相机状态(无需提前设置position,动画会自动过渡到目标位置) val cameraPositionState = rememberCameraPositionState() // 组件首次加载时触发动画;若需随destination变化重新触发,将key改为destination LaunchedEffect(Unit) { cameraPositionState.animate( // 创建相机更新指令,逻辑和传统方式一致 update = CameraUpdateFactory.newCameraPosition(targetCameraPosition), // 设置动画时长为1000ms durationMs = 1000 ) { isFinished -> // 可选:动画完成后的回调逻辑,isFinished表示是否正常结束 if (isFinished) { // 执行动画完成后的操作 } } } GoogleMap( modifier = Modifier.fillMaxSize(), cameraPositionState = cameraPositionState ) }
仅做缩放动画(不改变位置)
如果不需要移动相机位置,仅调整缩放级别,可以用zoomTo()创建相机更新:
LaunchedEffect(Unit) { cameraPositionState.animate( update = CameraUpdateFactory.zoomTo(15f), durationMs = 1000 ) }
关键说明
animate()是挂起函数,必须在协程中调用,LaunchedEffect是Compose中触发一次性协程逻辑的标准方式。- 若需要在特定状态变化时重复触发动画,修改
LaunchedEffect的key参数即可(比如LaunchedEffect(destination),当destination变化时重新执行动画)。 - 动画回调中的
isFinished参数可用于判断动画是否正常完成(比如未被用户手势中断)。
内容的提问来源于stack exchange,提问作者Tonnie
相关产品推荐
相关产品推荐

