我的应用程序最小SDK为21,因此无需添加
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
到Application类,因为它仅低于21(无论如何,我试图添加它都没有结果)。
我的build.gradle配置文件具有
defaultConfig {vectorDrawables.useSupportLibrary = true}
设置且未启用防护/缩小
debuggable true
crunchPngs false
minifyEnabled false
shrinkResources false
splits.abi.enable false
splits.density.enable false
无论如何,我使用AndroidStudio检查了编译后的.apk文件,并确保我的所有矢量可绘制对象确实存在于res / drawable文件夹中,因此它不是proguard / shrinker之类的东西。
我还要提到的是,我在此项目中使用的是androidx
而不是support
。
因此,我尝试了图像设置的所有可能变化:
setImageResource(imgResId);
setImageDrawable(ContextCompat.getDrawable(context, imgResId));
setImageDrawable(AppCompatResources.getDrawable(context, imgResId));
setImageDrawable(VectorDrawableCompat.createFromResource(resources, imgResId));
setImageDrawable(VectorDrawableCompat.create(resources, imgResId, null));
setImageDrawable(ResourcesCompat.getDrawable(resources, imgResId, null));
没有任何结果(实际上,结果始终是应用程序崩溃)。发送真实的Theme
而不是null
也没有帮助。
这是常见的PagerAdapter
,并且矢量可绘制图像在每个页面上都动态设置为对应的ImageView
,因此,当您(但不是必须)替换它时,并不是静态xml android:src="@drawable\ic_img"
与app:srcCompat="@drawable\ic_img"
。
我还尝试将图像包装到选择器中,例如:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/vector_image" />
</selector>
但没有运气-崩溃报告有所更改,但最终导致相同的异常。
this SO question和我发现的其他任何其他问题也无济于事。
我的矢量可绘制对象正在使用仅从API 24开始起作用的渐变。我正在API 26设备上测试我的应用,但尝试通过在android:fillColor
部分添加path
并注释渐变部分来替换所有渐变,喜欢:
<path
android:pathData="M268.177,..."
android:strokeWidth="1"
android:fillType="nonZero"
android:strokeColor="#00000000"
android:fillColor="#FFEF5E32">
<!--<aapt:attr name="android:fillColor">-->
<!--<gradient-->
<!--android:startY="84.70677"-->
<!--android:startX="284.02185"-->
<!--android:endY="70.083954"-->
<!--android:endX="252.21419"-->
<!--android:type="linear">-->
<!--<item android:offset="0" android:color="#FFEF5E32"/>-->
<!--<item android:offset="1" android:color="#FFF68F32"/>-->
<!--</gradient>-->
<!--</aapt:attr>-->
</path>
没有运气...
我意识到将向量导入png / webp很可能会解决此问题,但我想使用向量可绘制对象。
答案 0 :(得分:0)
当我为渐变部分应用补丁时,我注意到AndroidStudio突出显示了这些渐变部分,说它受API 24支持,而我的项目min API为21。因此,我决定检查其他警告,例如:
非常长的矢量路径(1456个字符),这对性能不利。 考虑降低精度,删除次要细节或栅格化 向量。
所以我开始怀疑它是问题的根源,因为在AndroidStudio的构建窗口中给出了一条错误消息(红色文本),指出:
字符串太大,无法使用写为 “ STRING_TOO_LARGE”。
但是没有胶合剂或指向这个问题的根源,它只是说明我的项目中某个地方的字符串很长,因此它可以是实例数据库或类似的东西。
最后,我在一个矢量可绘制对象中发现了一个异常-这是一个包含约51k个字符的路径字符串!当然,在导入时没有警告我(将SVG转换为xml,使用AndroidStudio完成)。
删除此路径可以解决崩溃问题,但还会丢失一部分图像。
因此,我使用Sketch分解了一个有问题的路径组,并在导入后产生了19k和24k字符的2条路径,虽然这都不好,但现在可以正常使用了。
顺便说一句,我找不到关于vector / xml的字符串长度限制的任何信息,但是gradle确实在构建时应用了此限制,因此众所周知。
The limit of one xml string length revealed in this SO question,找不到官方文件。