从流创建VectorDrawable似乎不起作用

3

我正在尝试从资产中加载矢量可绘制图形。

当我使用PNG文件时,它可以正常工作:

final String name = "image.png";
final InputStream stream = context.getAssets().open(name);
drawable = Drawable.createFromStream(stream, name);
stream.close();

我尝试使用VectorDrawable.createFromStream()和VectorDrawableCompat.createFromStream(),但两者都返回null。
当我将矢量图形添加到绘制资源中时,可以无问题地加载它。
我还尝试使用二进制XML文件,该文件在将矢量文件添加到绘制资源时创建。
我使用API级别24和支持库24.2.0以及Android 5.1.1进行测试。它应该适用于Android 4.2及更高版本。
有人知道如何解决这个问题吗?
这个问题可能与这个相关: 从SD卡加载矢量可绘制对象到ImageView
1个回答

7

在查看Android源代码后,我找到了一个解决方案。方法createFromStream似乎不支持矢量图形,因为它使用了BitmapFactory。

但是我们可以将其作为xml资源加载:

final XmlResourceParser parser = context.getAssets().openXmlResourceParser("assets/folder/image.xml");
drawable = VectorDrawableCompat.createFromXml(context.getResources(), parser);

image.xml必须是一个预编译的二进制XML文件。当您将矢量可绘制对象添加到绘制资源中时,可以从生成的apk文件中提取它们。

这种方法的问题是需要Android 5。但我需要适用于Android 4.2的可行代码。有人有想法吗?


你最终找到了 Android < 5.0 的解决方案吗? - Jérémy Reynaud
没有,我还没有找到任何解决方案。目前我正在为旧设备使用PNG格式的图片。 - Rocket
好的,谢谢。我想我也会使用PNG作为备用方案。 - Jérémy Reynaud
我假设您也可以使用非预计算的XML文件并自己创建xmlparser,类似于以下内容:“AssetManager assManager = context.getAssets(); InputStream is = assManager.open("vector.xml"); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is); drawable = VectorDrawableCompat.createFromXml(context.getResources(), xpp);” - lionscribe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接