是的,android vectordrawable原生不支持标签。它仅解析子集,渐变需用shapedrawable、png分层或弃用的第三方库替代,且usesupportlibrary配置无法解决此限制。

Android Vector Drawable 真的不支持 <gradient></gradient> 吗?
是的,原生 VectorDrawable(包括 VectorDrawableCompat)**完全不解析 <gradient></gradient> 标签**。哪怕你写进 .xml 里,低版本设备会直接忽略渐变、高版本也只认纯色 android:fillColor 或 android:strokeColor。这不是 bug,是设计限制——Android 的 Vector 实现只兼容 SVG 的 <path></path> 子集,而渐变属于 <defs></defs> + <lineargradient></lineargradient> 等外部引用机制,VectorDrawable 解析器压根没实现这一整套。
想在低版本 Android 上用“矢量+渐变”,只能绕路
没有银弹,只有三种可落地的替代方案,按推荐顺序排列:
-
方案一(首选):用
ShapeDrawable+GradientDrawable替代简单几何渐变图标 —— 比如箭头、圆角矩形、圆形按钮等。它天然支持android:angle、android:startColor等,且从 API 1 就存在,AppCompatActivity下也能通过ContextCompat.getDrawable()安全加载。 -
方案二:把渐变部分“栅格化”为 PNG —— 在 vector 文件中,只保留非渐变的路径轮廓(比如描边或遮罩),把渐变区域抽成单独的
layer-list,其中一层是带渐变的shape,另一层是 vector 轮廓(用android:drawable引用)。这样既保持缩放清晰度,又规避了 vector 渐变缺失问题。 -
方案三(慎用):用第三方库如
vector-compat或MrVector—— 这些库曾尝试扩展解析逻辑,但已多年未维护;vector-compat在 Gradle Plugin 1.5+ 下编译失败,MrVector已归档。官方从未将其纳入 support 库,也不建议新项目引入。
build.gradle 里配 vectorDrawables.useSupportLibrary = true 还够用吗?
够,但仅解决“能不能显示 vector”,不解决“能不能显示渐变”。这个配置的作用是让 AppCompatImageView 等控件在 setImageResource() 时自动委托给 AppCompatResources,进而调用 VectorDrawableCompat.create()。但它不会魔法般让渐变生效——底层仍是同一个不支持 <gradient></gradient> 的解析器。
- 必须确保 Activity 继承
AppCompatActivity,否则srcCompat属性无效 - 不能在
android:background直接引用 vector(尤其低版本),会 crash;要用app:srcCompat或代码中setImageResource() - 如果 minSdk generatedDensities = ['hdpi', 'xhdpi'],那 build 时会生成对应 PNG,此时 vector 渐变更无意义——你拿到的已经是位图
最常被忽略的崩溃点:背景图 + vector + 低版本
很多崩溃日志里看不到 “gradient” 字样,只报 Resources$NotFoundException 或 NullPointerException,根源其实是:把 vector 当作 android:background 设置在 View 上,而该 View 没走 AppCompat 的兼容链路。比如:
- 用
RelativeLayout的android:background="@drawable/ic_logo",且ic_logo.xml是 vector —— 5.0 以下必崩 - 自定义
View中手动调用getResources().getDrawable(R.drawable.xxx)—— 不经过AppCompatResources,直接掉进系统老 API 的坑 - 第三方 SDK(如 HelpShift、Unity 插件)打包时未包含
appcompat依赖,导致其内部加载 vector 失败
渐变只是表象,真正的兼容性雷区永远在资源加载路径是否被 AppCompat 正确接管。










