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

Jetpack Compose中Vector Group缩放如何正确设置pivotX/Y?

解决Jetpack Compose中Vector Group缩放动画偏移问题

要让特定省份区域以自身中心缩放,核心是计算该省份Path的包围盒中心,将其设为Group的pivotX和pivotY,具体步骤如下:

1. 获取省份Path的边界矩形

每个省份的Path都有自己的边界范围,通过Path.getBounds()方法可以得到包含该路径的最小矩形(Rect),里面包含了路径的left、top、right、bottom坐标。

2. 计算中心坐标

从边界矩形直接取中心值,就是该省份的中心点:

val pathBounds = provincePath.getBounds()
val pivotX = pathBounds.centerX()
val pivotY = pathBounds.centerY()

3. 应用到Group的缩放动画

将计算出的pivot值绑定到Group的属性上,配合缩放动画即可实现以自身中心缩放的效果。

完整代码示例

@Composable
fun NetherlandsMap() {
    // 模拟北荷兰省的路径(实际替换为你的省份路径数据)
    val northHollandPath = remember {
        Path().apply {
            moveTo(100f, 200f)
            lineTo(150f, 180f)
            lineTo(200f, 220f)
            lineTo(160f, 250f)
            close()
        }
    }

    // 计算路径边界和中心点
    val pathBounds = remember(northHollandPath) { northHollandPath.getBounds() }
    val pivotX = pathBounds.centerX()
    val pivotY = pathBounds.centerY()

    // 缩放动画状态
    val isSelected = remember { mutableStateOf(false) }
    val scale by animateFloatAsState(
        targetValue = if (isSelected.value) 1.15f else 1f,
        animationSpec = tween(durationMillis = 300),
        label = "ProvinceScale"
    )

    Canvas(modifier = Modifier.fillMaxSize().clickable { isSelected.value = !isSelected.value }) {
        // 绘制整个地图背景(省略其他省份)
        drawPath(
            path = northHollandPath,
            color = if (isSelected.value) Color(0xFF4CAF50) else Color(0xFFBDBDBD)
        )

        // 用Group逻辑实现缩放动画
        withTransform({
            scale(scale, scale, pivot = Offset(pivotX, pivotY))
        }) {
            drawPath(
                path = northHollandPath,
                color = Color(0xFF2196F3),
                style = Stroke(width = 2f)
            )
        }
    }
}

注意事项

  • 如果你的路径是从XML Vector资源中获取的,需要先将pathData字符串解析为Compose的Path对象,再计算边界:
    val pathDataString = "M100 200 L150 180 L200 220 L160 250 Z" // XML中的pathData
    val provincePath = remember { Path().apply { addPath(PathDataParser.parsePathData(pathDataString)) } }
    
  • 确保路径坐标是省份自身的相对坐标,而非整个地图的绝对坐标,否则计算出的中心会偏移。

内容的提问来源于stack exchange,提问作者Niels Masdorp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:27:33