fillalpha 从 api 21 开始支持,低版本需用 argb 格式 fillcolor 模拟;其值与 fillcolor 的 alpha 叠加计算最终透明度,仅接受 0.0~1.0 浮点数,错误格式或 vectordrawablecompat 降级会导致失效。

fillAlpha 在 vector drawable 中不生效?先确认 API 级别
Android 的 fillAlpha 属性从 API 21(Lollipop)才开始支持,低于这个版本会被完全忽略——不是“没效果”,是压根不解析。如果你在 minSdkVersion ≤ 16 的项目里写 fillAlpha="0.5",运行时不会报错,但颜色就是实心的。
- API 21+:支持
fillAlpha和strokeAlpha,可独立控制填充/描边透明度 - API 20 及以下:只能靠把
android:fillColor写成带 alpha 的 ARGB 值(如#80FF0000)来模拟 - 使用 Android Studio 预览时,注意右上角显示的 API 版本——它可能默认用高版本渲染,掩盖低版本问题
fillAlpha 和 fillColor 的 alpha 值会叠加
fillAlpha 不是“最终透明度”,而是乘性因子:最终 alpha = fillAlpha × fillColor 的 alpha 分量。比如 android:fillColor="#FF0000FF"(纯蓝,alpha=255)配 android:fillAlpha="0.5",结果是半透蓝色;但如果 fillColor="#800000FF"(本身 alpha=128),再设 fillAlpha="0.5",最终 alpha 就只剩 64。
- 想精确控制最终透明度?统一用
fillColor的 ARGB 表示,别混用fillAlpha - 需要动态改透明度?优先用
setAlpha()或setColorFilter()操作Drawable对象,比 XML 更可控 - 矢量图里多个
<path></path>共享同一组颜色属性时,fillAlpha是各自独立作用的
VectorDrawableCompat 里 fillAlpha 的兼容性陷阱
用 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) 或依赖 androidx.appcompat:appcompat 时,fillAlpha 在低版本上看似能用,其实是通过编译期生成 PNG 回退实现的——这意味着你写的 fillAlpha 会被“拍平”进位图,失去矢量缩放优势,且无法在运行时动态修改。
- 检查 build 输出目录:
build/intermediates/vector_drawable/svg-cache下有没有对应 PNG,有就说明被降级了 - 如果必须支持低版本又需要动态透明度,建议改用
AnimatedVectorDrawable+ObjectAnimator控制alpha属性 - Gradle 插件 4.1+ 默认启用矢量向后兼容,但
fillAlpha这类较新属性仍可能触发静默降级
XML 中写错格式导致 fillAlpha 被忽略
fillAlpha 只接受浮点数(0.0 ~ 1.0),不能写整数、百分比或十六进制。写成 fillAlpha="50%"、fillAlpha="128" 或 fillAlpha="0xFF" 都不会报错,但属性直接失效,渲染为默认不透明。
- 正确写法只有:
android:fillAlpha="0.0"、android:fillAlpha="1.0"、android:fillAlpha="0.75" - AS 的 XML 校验不会提示这类错误,得靠真机/模拟器验证视觉效果
- 如果路径用了
android:tint,fillAlpha依然有效,但 tint 本身也带 alpha,同样存在叠加效应
fillAlpha,结果比预期还淡,查半天才发现是两层 alpha 相乘了。










