strokeAlpha 在 API 21+ 才生效,低版本需用带 alpha 的 ARGB 值(如 #4D000000);动态修改须调用 mutate() 后设 setStrokeAlpha(0–255),且避免与 tint 冲突。

strokeAlpha 在 vector drawable 中不生效?
Android 的 strokeAlpha 属性在 API 21+ 才被真正支持,低于这个版本会被静默忽略——不是写错了,是系统压根不认。很多开发者在低版本设备上调试时发现描边“变不透明”,其实是属性被跳过,而非颜色计算出错。
-
strokeAlpha必须和android:strokeColor配合使用;单独设strokeAlpha没效果 - API 21 之前(如 19/20),
strokeAlpha完全无效,需改用带 alpha 的十六进制色值(如#80FF57AB)模拟 - 即使 API ≥ 21,若
strokeColor是通过 theme attribute 引用(如?attr/colorOnSurface),strokeAlpha仍可能失效——系统无法对动态色值叠加 alpha
vector drawable 中描边透明度的正确写法
最稳妥的方式是把 alpha 直接嵌入 strokeColor 值里,兼容所有 API 级别,且不依赖 runtime 计算:
<path
android:strokeColor="#4D000000"
android:strokeWidth="2"
... />
其中 #4D000000 的前两位 4D 表示 30% 透明度(即 70% 不透明)。注意:不是 android:strokeAlpha="0.3",而是手动换算成 ARGB 十六进制。
- 换算口诀:alpha 值(0–1)→ 十进制 → 两位十六进制(如 0.3 × 255 ≈ 77 →
4D) - 不要用
#00000000这类全透明色——某些旧版渲染器会把它当空色处理,导致描边消失而非变透明 - 如果项目强制要求用
strokeAlpha(例如需要动态修改),务必加 minSdkVersion ≥ 21 并做降级 fallback
用 strokeAlpha 动态改描边透明度?小心 runtime crash
通过 mutate() + setStrokeAlpha() 修改时,必须确保该 VectorDrawable 未被复用(比如从 getDrawable() 拿来直接改),否则会在多处同步生效,甚至触发 IllegalStateException。
- 必须先调用
drawable.mutate(),再调用drawable.setStrokeAlpha(128) -
setStrokeAlpha()参数是 0–255 的整数,不是浮点数(别传0.5f) - 仅对 API 21+ 有效;API 20 及以下调用该方法会静默失败,不会 crash,但也不起作用
- 如果 vector 被用在
ImageView且开启了 tint,tint 会覆盖 stroke 颜色和 alpha,此时改strokeAlpha完全无效
为什么 Designer 给的 SVG 转成 vector 后描边透明度不对?
Android Studio 的 SVG to Vector Asset 工具默认会把 stroke-opacity 映射为 strokeAlpha,但只在生成时保留一次——后续手动编辑 XML 或重导出可能丢失该映射,或把 opacity 错误合并进 strokeColor 值中。
- 导入后立刻检查生成的 XML:确认存在
android:strokeAlpha且值合理(0–255),而不是只有android:strokeColor - 若原始 SVG 有
stroke-opacity="0.2",但生成结果是strokeColor="#33000000",说明工具已做合并,此时再加strokeAlpha会导致双重透明 - 建议关闭 AS 的 “Auto-update” 选项,每次导出后手动验证描边表现,尤其在 targetSdkVersion 升级后










