You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:15:31