Android 21中android:fillType="evenOdd"致矢量图损坏的修复方案咨询
解决Android 21中
android:fillType="evenOdd"导致矢量Drawable损坏的问题 我来帮你搞定这个API 21上的矢量图渲染问题,先理清楚背后的原因,再给你几个可行的修复方案:
问题根源
Android 5.0(API 21)对矢量Drawable的android:fillType="evenOdd"属性存在原生支持bug,这个属性会导致矢量图渲染异常。而你的release包自动移除该属性,是因为Android Gradle插件在release构建时默认会做矢量图兼容优化——自动剔除低版本不支持的属性,甚至生成PNG fallback图;但debug模式下默认关闭了部分优化,保留了这个属性,所以API 21上显示损坏。
修复方案
1. 手动调整矢量Drawable文件(最直接)
如果你的视觉效果允许,直接移除android:fillType="evenOdd"属性即可——因为矢量图默认的填充规则是nonZero,API 21完全支持。如果必须保留evenOdd的填充效果(比如需要镂空复杂形状),可以通过以下方式模拟:
- 把复杂的路径拆分成多个独立的路径,用叠加的方式实现和
evenOdd一样的视觉效果; - 重新绘制矢量图,确保使用
nonZero规则也能达到预期的镂空/填充效果。
示例修改:
原代码:
<path android:fillColor="#FF0000" android:fillType="evenOdd" android:pathData="..." />
修改后:
<path android:fillColor="#FF0000" android:pathData="..." />
2. 让debug构建也启用矢量图兼容优化
在app模块的build.gradle(或build.gradle.kts)中配置,让debug模式和release一样处理不兼容的矢量图属性:
android { defaultConfig { // 启用支持库的矢量图兼容 vectorDrawables.useSupportLibrary = true } buildTypes { debug { // AGP 7.0以下版本配置生成兼容PNG的密度 vectorDrawables.generatedDensities = ['hdpi', 'xhdpi', 'xxhdpi', 'xxxhdpi'] // AGP 7.0+版本用下面的配置 // vectorDrawables.generateFallbackPngs = true } } }
配置后,debug构建时也会自动移除evenOdd这类API 21不支持的属性,或者生成兼容的PNG图,避免渲染损坏。
3. 分版本适配资源
如果高版本系统需要保留evenOdd的效果,同时兼容API 21,可以创建版本差异化资源:
- 在
res/drawable/目录下放带有android:fillType="evenOdd"的矢量图(供API 22+使用); - 创建
res/drawable-v21/目录,放入移除了fillType属性的同名称矢量图(供API 21及以下使用)。
这样系统会根据API版本自动加载对应的资源,兼顾效果和兼容性。
内容的提问来源于stack exchange,提问作者UmAnusorn
相关产品推荐
相关产品推荐

