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

Compose Canvas绘制内容仅预览显示、运行界面不显示的问题

问题描述

在Compose组件内使用Canvas绘制的竖线仅在预览中可见,单独复制Canvas部分代码时却能正常显示。

相关Compose代码

Card(
        elevation = 6.dp,
        shape = RoundedCornerShape(15.dp),
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 12.dp, vertical = 8.dp)
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .background(color = backgroundColor),
        ) {
            AsyncImage(modifier = Modifier
                .height(180.dp)
                .width(120.dp)
                .padding(12.dp)
             ...  )
              

            Row(
                modifier = Modifier.fillMaxSize()
            ) {

                Column(
                    modifier = Modifier
                        .fillMaxHeight()
                        .weight(0.7f)
                ) {
                   ...
                }

                Canvas(
                    modifier = Modifier
                        .weight(0.3f)
                        .fillMaxHeight()
                        .padding(start = 6.dp)
                ) {
                   // NOT SHOW !!!
                    drawLine(
                        color = Color.White,
                        start = Offset(0f, 0f),
                        end = Offset(0f, size.height),
                        strokeWidth = 2f,
                        pathEffect = PathEffect.dashPathEffect(floatArrayOf(20f, 20f), 0f),
                    )
                }
            }

        }
    }

截图

问题截图

问题出在这

Canvas加了padding(start = 6.dp)后,绘制区域会向右偏移6dp,而你画线条的起点是Offset(0f, 0f)——这个位置属于padding的裁剪区域,线条直接被裁没了。预览模式的裁剪逻辑和实际运行不一样,所以预览里能看见线条。

两种解决办法任你选

  1. 调整线条起始位置:把线条的起始x坐标改成6dp对应的像素值,让线条落在可见区域内:
Canvas(
    modifier = Modifier
        .weight(0.3f)
        .fillMaxHeight()
        .padding(start = 6.dp)
) {
    val paddingStart = 6.dp.toPx()
    drawLine(
        color = Color.White,
        start = Offset(paddingStart, 0f),
        end = Offset(paddingStart, size.height),
        strokeWidth = 2f,
        pathEffect = PathEffect.dashPathEffect(floatArrayOf(20f, 20f), 0f),
    )
}
  1. 用offset替代padding:如果只是想让Canvas整体右移6dp,用offset(x = 6.dp)代替padding,这样不会裁剪绘制内容:
Canvas(
    modifier = Modifier
        .weight(0.3f)
        .fillMaxHeight()
        .offset(x = 6.dp)
) {
    drawLine(
        color = Color.White,
        start = Offset(0f, 0f),
        end = Offset(0f, size.height),
        strokeWidth = 2f,
        pathEffect = PathEffect.dashPathEffect(floatArrayOf(20f, 20f), 0f),
    )
}

另外也可以检查内层Row的布局对齐,比如给它添加verticalAlignment = Alignment.CenterVertically,不过最核心的问题还是padding导致的裁剪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:30:57