Android开发:如何获取VectorDrawable中指定ID的路径以动态设置背景色
VectorDrawable内部路径动态修改颜色的实现方案
基础逻辑
VectorDrawable的内部path节点不属于View视图体系,没有全局的视图ID查找机制,元素匹配是基于节点的android:name属性实现的,需要通过兼容版矢量Drawable的开放接口获取对应path实例,再完成颜色动态修改。
实现步骤
- 加载可修改的矢量Drawable实例
从资源加载矢量图时,必须通过mutate()方法解除Drawable的全局共享缓存状态,避免修改属性后影响所有引用同一资源的界面元素,全版本适配推荐使用VectorDrawableCompat替代原生VectorDrawable:val nextIcon = VectorDrawableCompat.create( resources, R.drawable.ic_next, theme )?.mutate() - 查找目标path实例
调用getTargetByName方法,匹配path节点上配置的android:name属性值获取对应路径对象。注意:低版本兼容库不会识别path节点上配置的
android:id,仅通过android:name完成元素匹配,这也是配置了ID但找不到对象的核心原因val firstPath = nextIcon?.getTargetByName("background_first") as? VectorDrawableCompat.VectorDrawablePath val secondPath = nextIcon?.getTargetByName("background_second") as? VectorDrawableCompat.VectorDrawablePath - 动态设置路径填充色
拿到path实例后直接修改fillColor属性即可,Drawable的状态变更会自动触发绑定的View重绘,不需要额外手动刷新:// 示例:将两个路径分别设置为红色、半透明灰色 firstPath?.fillColor = ColorStateList.valueOf(Color.RED) secondPath?.fillColor = ColorStateList.valueOf(Color.parseColor("#808080"))
适配注意事项
- 不调用
mutate()直接修改Drawable属性,会导致所有引用该矢量图的页面同步变色,出现显示异常 getTargetByName接口需要1.1.0以上版本的androidx.core、androidx.appcompat兼容库支持,过低版本的依赖不会开放路径查找能力- API 24及以上的原生系统支持通过
getTargetById匹配path节点上配置的android:id,但为了全版本兼容,仍优先使用android:name字段做元素匹配
内容的提问来源于stack exchange,提问作者Mathieu Rios
相关产品推荐
相关产品推荐

