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

Jetpack Compose绘制向量无显示:代码问题排查求助

问题:Jetpack Compose中向量绘制无内容显示的原因及解决方法

我想了解如何在Jetpack Compose中绘制向量,编写了如下预览代码:

@Preview
@Composable
fun PreviewScreen(){
    val vector = ImageVector.Builder(
        defaultWidth = 100.dp,
        defaultHeight = 100.dp,
        viewportWidth = 10f,
        viewportHeight = 10f,
        tintBlendMode = BlendMode.SrcOver
    ).path(fill = Brush.horizontalGradient(listOf(Color.Green, Color.Blue))) {
        moveTo(1f,1f)
        lineTo(8f, 8f)
    }.build()

    val painter = rememberVectorPainter(image = vector)
    Canvas(modifier = Modifier.fillMaxSize()){
        with(painter){
            draw(painter.intrinsicSize)
        }
    }
}

我期望能看到一条渐变线条,但运行后却没有任何内容显示,请问这是为什么?我哪里出错了?


错误原因

你的代码存在两个核心问题:

  • fill参数针对封闭图形生效,而你画的是开放线段:path里只调用了moveTo和lineTo,形成的是一条未封闭的直线,填充操作对开放路径无效,所以看不到内容。
  • 绘制线条需用stroke参数而非fill:ImageVector.Builder的path方法中,fill负责填充封闭区域,stroke才是设置线条样式的参数。

修正后的代码

@Preview
@Composable
fun PreviewScreen(){
    val vector = ImageVector.Builder(
        defaultWidth = 100.dp,
        defaultHeight = 100.dp,
        viewportWidth = 10f,
        viewportHeight = 10f,
        tintBlendMode = BlendMode.SrcOver
    ).path(
        // 设置线条宽度与渐变描边
        stroke = Stroke(
            width = 1f,
            brush = Brush.horizontalGradient(listOf(Color.Green, Color.Blue))
        )
    ) {
        moveTo(1f,1f)
        lineTo(8f, 8f)
    }.build()

    val painter = rememberVectorPainter(image = vector)
    Canvas(modifier = Modifier.fillMaxSize()){
        with(painter){
            draw(painter.intrinsicSize)
        }
    }
}

额外说明

  • 若要使用填充效果,需要将路径封闭,比如添加close()方法,或者绘制线条回到起点形成封闭图形,此时fill参数才会生效。
  • Stroke的width单位基于你设置的viewport,这里viewportWidth为10f,所以1f的宽度会占视图的1/10比例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:57:05