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

Jetpack Compose Canvas调用drawPath不生效 滑动时无绘制效果

问题原因

  • 你当前使用remember存储的是普通Path实例,Path本身不是Jetpack Compose的可观察状态类型,修改Path内部的路径数据不会触发Compose重组,Canvas的绘制逻辑不会重新执行,因此看不到滑动生成的轨迹。
  • 不需要额外更换pointerInteropFilter实现,只需要给Path加上可观察状态包装即可。

修复后代码

@ExperimentalComposeUiApi
@Composable
fun CanvasDraw() {
    // 用mutableStateOf把Path包装为可观察状态
    var path by remember { mutableStateOf(Path()) }

    Canvas(modifier = Modifier
        .fillMaxSize()
        .pointerInteropFilter {
            when (it.action) {
                MotionEvent.ACTION_DOWN -> {
                    // 修改状态触发重组
                    path = path.apply {
                        moveTo(it.x, it.y)
                    }
                    true
                }
                MotionEvent.ACTION_MOVE -> {
                    path = path.apply {
                        lineTo(it.x, it.y)
                    }
                    true
                }
                else -> false
            }
            true
        }) {
        drawPath(
            path = path,
            color = Color.Blue,
            style = Stroke(10f)
        )
    }
}

可选优化方案

如果想要更符合Compose原生实现规范,可以用pointerInput替代pointerInteropFilter,不需要标记ExperimentalComposeUiApi注解:

@Composable
fun CanvasDraw() {
    var path by remember { mutableStateOf(Path()) }

    Canvas(modifier = Modifier
        .fillMaxSize()
        .pointerInput(Unit) {
            detectDragGestures { change, _ ->
                if (change.previousPressed != change.pressed && change.pressed) {
                    path = path.apply {
                        moveTo(change.position.x, change.position.y)
                    }
                } else if (change.pressed) {
                    path = path.apply {
                        lineTo(change.position.x, change.position.y)
                    }
                }
            }
        }
    ) {
        drawPath(
            path = path,
            color = Color.Blue,
            style = Stroke(10f)
        )
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:10