如何在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
相关产品推荐
相关产品推荐

