strokecolor 必须写在 标签内,如 android:strokecolor="#ff33b5e5",且需配合 android:strokewidth 使用;不支持命名色、简写色或变量,必须为8位十六进制(#aarrggbb)。

strokeColor 属性写在哪?不是在 里
很多人直接往 <path></path> 标签里加 strokeColor,结果没效果——因为这个属性属于 <vector></vector> 或 <group></group> 的子元素 <path></path> 的父级控制项,但实际生效位置只在 <path></path> 自身。正确写法是把 strokeColor 当作 <path></path> 的属性,而不是外层容器的。
常见错误现象:strokeColor 写在 <vector></vector> 或 <group></group> 上完全被忽略;写对了但颜色还是不对,大概率是 strokeWidth 为 0 或路径本身没描边(比如只用了 fillColor)。
-
strokeColor必须写在<path></path>标签内,例如:<path android:strokecolor="#FF0000" ...></path> - 如果路径只有填充没有描边,要同时设置
android:strokeWidth(哪怕只是1),否则strokeColor不可见 - 十六进制颜色必须带 alpha 位(如
#FF000000表示不透明黑),写成#000或#000000会解析失败,静默回退为默认色
XML 中颜色值怎么写才不被忽略
Android 对 vector drawable 的颜色解析很严格:不支持命名色(如 @color/red)直接写在 strokeColor 里,也不接受简写格式。所有颜色必须是硬编码的 8 位十六进制(#AARRGGBB),且不能含空格或换行。
使用场景:你正在改一个已有的 .xml 矢量图,想快速调色做 A/B 测试,或者适配深色模式临时覆盖。
- 正确:
android:strokeColor="#FF33B5E5"(半透明白底蓝线) - 错误:
android:strokeColor="@color/accent"(编译报错Resource ID not found) - 错误:
android:strokeColor="#33B5E5"(缺 alpha,被当成#FF000000黑色) - 错误:
android:strokeColor="${primaryColor}"(XML 不支持变量插值)
Java/Kotlin 代码里动态改 strokeColor 为什么无效
用 VectorDrawable 的 mutate() + setTint() 改不了描边色——那是给整个 drawable 上 tint,只影响 fillColor,对 strokeColor 无感。真要运行时改,得走 PathParser 解析再重设,成本高、易出错。
性能影响:每次动态修改都需重建 Path 和 PathData,低端机上可能卡顿;兼容性上,API 21+ 才支持完整 vector 动态操作,21 以下基本不可行。
- 静态方案更稳:为不同状态准备多套 XML(如
ic_arrow_stroke_red.xml、ic_arrow_stroke_blue.xml),用ContextCompat.getDrawable()切换 - 若必须动态,优先改
strokeWidth或整体 tint,别碰strokeColor—— 它没公开 API 支持安全修改 - 别信网上“用
setColorFilter()能改描边”的说法,那是对 bitmap drawable 的理解错位到 vector 上了
深色模式下 strokeColor 自动变黑?
不是自动变,是你的 XML 文件被系统选中了错误的资源目录。vector drawable 本身不感知深色模式,颜色值全靠资源加载逻辑决定。如果你发现夜间模式下线条变黑,大概率是 res/drawable-night/ 下放了一个同名但 strokeColor 写死为 #FF000000 的文件,或者主题里 colorControlNormal 被误用于 vector 渲染(其实不会)。
容易被忽略的地方:Android Studio 的资源预览有时会缓存旧版本,改完 strokeColor 看不出效果,先 Clean Project 再重编。
- 检查是否意外复制了一份 XML 到
drawable-night目录下,且未同步修改颜色 - 确认没在
app:srcCompat外又套了一层tint属性(如android:tint),它会混合叠加,让本意是红色的描边变灰黑 - 如果用了
AnimatedVectorDrawable,注意<target></target>绑定的是fillColor还是strokeColor,写反了动画就动错了地方










