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

如何在Kotlin运行时动态修改VectorDrawable指定路径填充色

动态修改VectorDrawable指定名称路径的填充颜色(Kotlin实现)

前提准备

先确保你的VectorDrawable资源中,目标路径都设置了唯一的android:name属性,示例XML如下(res/drawable/vector_multi_path.xml):

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:name="path_heart"
        android:fillColor="#FF0000"
        android:pathData="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>

    <path
        android:name="path_star"
        android:fillColor="#FFFF00"
        android:pathData="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/>
</vector>

可行实现方案

通过VectorDrawableCompat兼容多版本设备,遍历内部路径匹配指定名称后修改填充色,核心代码如下:

import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val imageView = findViewById<AppCompatImageView>(R.id.iv_vector)

        // 加载兼容版VectorDrawable
        val vectorDrawable = VectorDrawableCompat.create(resources, R.drawable.vector_multi_path, theme)
        vectorDrawable?.let {
            // 修改指定路径的颜色
            modifyPathFillColor(it, "path_heart", Color.GREEN)
            modifyPathFillColor(it, "path_star", Color.BLUE)
            imageView.setImageDrawable(it)
        }
    }

    /**
     * 修改VectorDrawable中指定name的路径填充色
     * @param drawable 目标VectorDrawableCompat实例
     * @param targetPathName 目标路径的name属性值
     * @param newColor 新的填充色
     */
    private fun modifyPathFillColor(drawable: VectorDrawableCompat, targetPathName: String, newColor: Int) {
        // 调用mutate()避免修改影响所有共享该drawable的实例
        val mutableDrawable = drawable.mutate()
        // 遍历所有路径,匹配目标名称
        mutableDrawable.paths.forEach { path ->
            if (path.name == targetPathName) {
                path.fillColor = newColor
            }
        }
        // 通知drawable刷新显示
        mutableDrawable.invalidateSelf()
    }
}

关键注意事项

  • 必须调用mutate():VectorDrawable默认是共享实例,不调用的话修改会影响所有使用该drawable的View,mutate()会创建一个独立的可修改实例。
  • 路径名称唯一性:确保所有需要修改的路径都设置了唯一的android:name,否则无法精准匹配目标路径。
  • 版本兼容:API 21以下设备必须使用VectorDrawableCompat,直接使用系统VectorDrawable会抛出异常。
  • 复用场景处理:如果在列表(RecyclerView/ListView)中使用,需在View复用时重置drawable状态,避免颜色错乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:34:49