android:tint在vector drawable XML中无效,必须设置在ImageView等View上;需用ColorStateList实现状态变色,避免直接修改drawable。

android:tint 在 vector drawable 中不起作用?检查 root vector 是否设置了 tint 或 tintMode
直接在 vector 标签上写 android:tint 是无效的——它只对引用该矢量图的 View(比如 ImageView)生效,不是 vector XML 自身的属性。很多人把 tint 写进 res/drawable/ic_home.xml 里却没效果,就是因为误以为这是矢量图的“内置染色”机制。
真正起作用的方式是:在布局中给使用它的 View 加上 tint 属性,或通过代码调用 setColorFilter。XML 中的 vector 文件本身只定义形状和原始颜色(android:fillColor),不参与运行时染色逻辑。
-
android:tint必须写在ImageView、ImageButton等支持 tint 的 View 上,不是vector标签内 - 如果 vector 文件里已有
android:fillColor="#FF0000",又在 ImageView 上设了android:tint="#00FF00",最终显示的是绿色(tint 覆盖 fill color) - 默认
tintMode是src_in,适合单色图标;若需保留 alpha 或叠加效果,可显式设为multiply或screen
想让 vector 在不同状态(如 disabled/pressed)自动变色?用 ColorStateList 而不是硬编码 tint
静态 android:tint="@color/blue" 只能统一染一种色,但按钮、Tab 等控件常需根据状态切换颜色。这时必须用 ColorStateList,否则 disabled 状态下图标还是亮色,体验断裂。
做法是单独建一个 res/color/icon_tint.xml,再在 ImageView 中引用它:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/icon_disabled" android:state_enabled="false"/>
<item android:color="@color/icon_pressed" android:state_pressed="true"/>
<item android:color="@color/icon_normal"/>
</selector>
- 务必确保
ColorStateList文件放在res/color/目录下,放错位置(比如丢进drawable)会导致编译通过但运行时报Resources$NotFoundException - 在 API 23+ 上推荐用
app:tint(来自 AppCompat)替代android:tint,兼容性更好;旧版用android:tint即可 - 如果 vector 里用了多个
path且填色不同,tint会一并覆盖所有fillColor,无法单独控制某条路径
Vector 图标变灰、发虚、边缘模糊?检查 android:width/android:height 和屏幕密度适配
明明写了 tint,颜色也对,但图标看起来糊、偏色、有锯齿——大概率是 vector 的原始尺寸和实际渲染尺寸不匹配。Android 会按 vector 定义的 android:viewportWidth 和 android:viewportHeight 缩放绘制,若 android:width 设得太小(比如 24dp),高分辨率屏上会被拉伸,抗锯齿失效。
- 建议 viewport 保持整数(如
24×24),width/height设为24dp或wrap_content,避免硬写16px这类绝对值 - 不要在 vector XML 里用
android:fillColor="?attr/colorControlNormal"这类主题色引用——它在编译期无法解析,运行时 fallback 成黑色 - 如果图标在某些机型上完全不显示,检查是否用了
app:srcCompat(而非android:src)加载 vector,尤其在低于 API 21 的设备上
Java/Kotlin 里动态改 tint?别直接调 getDrawable(),用 ImageView.setImageTintList()
想在代码里根据用户操作切换图标颜色?很多人习惯先 getDrawable() 再 setTint,这会破坏 VectorDrawable 的 state 持有逻辑,导致后续 tint 失效或状态错乱。
- 正确方式是直接对 ImageView 调用
imageView.setImageTintList(colorStateList)或imageView.setColorFilter(color, mode) - 如果用
ContextCompat.getColorStateList(context, R.color.icon_tint)加载,注意 API 23+ 才支持直接传R.color.xxx,低版本需用AppCompatResources.getColorStateList() - 动态修改后记得调用
imageView.invalidate()强制重绘(虽然多数情况自动触发,但某些自定义 View 下可能漏掉)










