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

Compose中如何为Image/Icon矢量图添加渐变着色效果

Compose 矢量图渐变着色实现方案

可以实现矢量图的渐变着色,无需依赖ColorFilter的单色着色能力,以下是两种可直接落地的实现方式:

  • 方案1:通过Modifier.drawWithContent配合BlendMode实现(通用方案,适配所有矢量图标)
    核心逻辑是先绘制原始矢量图,再用渐变画笔叠加并使用SrcIn混合模式保留矢量图的轮廓,仅替换着色内容:

    // 定义渐变Brush
    val gradientBrush = Brush.linearGradient(
        colors = listOf(Color(0xFF6200EE), Color(0xFF3700B3)),
        start = Offset.Zero,
        end = Offset.Infinite
    )
    
    Icon(
        painter = painterResource(id = R.drawable.ic_your_vector),
        contentDescription = null,
        modifier = Modifier
            .size(48.dp)
            .drawWithContent {
                // 先绘制原始图标作为遮罩
                drawContent()
                // 叠加渐变,使用SrcIn混合模式仅保留和图标轮廓重叠的区域
                drawRect(
                    brush = gradientBrush,
                    blendMode = BlendMode.SrcIn
                )
            }
    )
    

    适配说明:Compose 1.2.0以下版本可将BlendMode替换为PorterDuffMode.SRC_IN配合drawIntoCanvas实现,逻辑完全一致。

  • 方案2:自定义矢量图path的填充Brush(适合固定渐变规则的矢量图)
    如果需要为矢量图的不同path设置差异化渐变,可直接在定义ImageVector时为对应path设置fill属性为渐变Brush:

    val customVector = ImageVector.Builder(
        defaultWidth = 24.dp,
        defaultHeight = 24.dp,
        viewportWidth = 24f,
        viewportHeight = 24f
    ).apply {
        path(
            fill = Brush.linearGradient(
                colors = listOf(Color.Red, Color.Blue)
            )
        ) {
            // 矢量图路径绘制逻辑
            moveTo(12f, 2f)
            lineTo(22f, 22f)
            lineTo(2f, 22f)
            close()
        }
    }.build()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:36:06