[置顶] SVG 兼容以及开发中碰到的坑

时间:2022-11-20 18:36:20
Android 5.0发布的时候,Google提供了Vector的支持。Vector Drawable相对于普通的Drawable来说,有以下几个好处:
 -Vector图像可以自动进行适配,不需要通过分辨率来设置不同的图片
 -Vector图像可以大幅减少图像的体积,同样一张图,用Vector来实现,可能只有PNG的几十分之一
 -使用简单,很多设计工具,都可以直接导出SVG图像,从而转换成Vector图像
 -功能强大,不用写很多代码就可以实现非常复杂的动画

 -成熟、稳定,前端已经非常广泛的进行使用了  



具体怎么使用SVG,不多说了,不是重点,重点是使用SVG中的坑,巨坑~


首先,Android5.0发布的SVG,所以向下兼容是一个大问题,不处理这块儿,就会android.content.res.Resources$NotFoundException~

处理这个问题,也要判断你的Gradle版本:

Gradle plugin2.0以上的:

android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}

Gradle plugin2.0以下,1.5以上的:

android {
defaultConfig {
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}
// Flag to tell aapt to keep the attribute ids around
aaptOptions {
additionalParameters "--no-version-vectors"
}
}


除此之外,还有个大坑,前阵子项目整体改UI,底部导航栏我也换成了SVG,因为每个导航都用到了selector选择器,明明我也设置了SVG的兼容,可就是无限报错,最后是在*找到了解决办法,google开发人员给出的解释是:

首先,这个功能最初是在23.2.0发布,但是我们发现了一些内存使用和配置更新问题,所以我们在23.3.0移除。23.4.0(技术修复版本)我们已经重新添加相同的功能,但在一个您需要手动启用标志。

具体解决办法就是在你使用的类中添加下面代码:

 

static {    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);}