是否可以从文件系统(*.xml文件)创建VectorDrawable

Jay*_*_DK 6 xml android android-vectordrawable

我想在我的Android应用程序中使用VectorDrawables.
我想从文件系统加载一个xml文件,并获取一个实例android.graphics.Drawable来显示它ImageView.如果我将xml文件添加到Resources目录,它可以工作.但是当我尝试从文件系统加载它时,我总是得到一个NullPointer.

我目前正在尝试通过Drawable.createFromPath(*Path to File*)或加载文件 VectorDrawable.createFromPath(*Path to File*),但我一直在获取NullPointer.文件存在且是一个有效的xml文件(见下文).

在adb日志中我总是得到:

SkImageDecoder::Factory returned null
Run Code Online (Sandbox Code Playgroud)

当我使用 mContext.getFilesDir()Path看起来像

/data/data/*packagename*/files/*filename*.xml
Run Code Online (Sandbox Code Playgroud)

我还尝试了一些像"下载"这样的公共文件夹.当我用File.io Api检查文件时exists(),canRead()canWrite()

更新这是从Android Dev Pages获取的XML代码

 <vector xmlns:android="http://schemas.android.com/apk/res/android"
 android:height="64dp"
 android:width="64dp"
 android:viewportHeight="600"
 android:viewportWidth="600" >
 <group
     android:name="rotationGroup"
     android:pivotX="300.0"
     android:pivotY="300.0"
     android:rotation="45.0" >
     <path
         android:name="v"
         android:fillColor="#000000"
         android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
 </group>
Run Code Online (Sandbox Code Playgroud)

n00*_*ind 10

实际上,是的,你可以,而且我已经在我自己的项目中做到了。

不过,正如在前面的答案中提到的,您确实需要 XML drawable 的编译版本,而不是您从 Android Studio 获得的版本。AFAIK,VectorDrawable API 尚不支持从原始 XML 加载。

为此,只需将您的图像临时放在res目录下,以便在构建过程中将它们编译为普通资源,然后找到生成的 APK 并从中提取它们(您会注意到它们不再是文本文件,而是二进制文件)文件)。现在将它们再次放在您的资产目录下您想要的任何位置,并使用类似于此的代码将它们加载为可绘制对象:

XmlResourceParser parser = context.getAssets()
    .openXmlResourceParser("assets/folder/image.xml");
drawable = VectorDrawableCompat.createFromXml(context.getResources(), parser);
Run Code Online (Sandbox Code Playgroud)

注意路径的“assets/”部分。这是必需的,afaik。

  • 是否也可以从文件系统执行此操作?由于某种原因,当尝试解析我已放入文件中的“ic_launcher_foreground.xml”时,我得到“java.lang.ClassCastException:android.util.XmlPullAttributes无法转换为android.content.res.XmlBlock$Parser”文件系统 (3认同)

Mic*_*lan 7

抱歉不行。除非您以编译资源的方式以某种方式编译 XML 源文件。 VectorDrawable当前假定已编译的图像源。

否则你可能会写这样的东西:

VectorDrawable d = new VectorDrawable();
try( InputStream in = new FileInputStream( *Path to File* ); )
{
    XmlPullParser p = Xml.newPullParser();
    p.setInput( in, /*encoding, self detect*/null );
    d.inflate( getResources(), p, Xml.asAttributeSet(p) ); // FAILS
}
Run Code Online (Sandbox Code Playgroud)

当前失败(API 级别 23,Marshmallow 6.0),因为 inflate 调用尝试将属性集强制转换为 an XmlBlock.Parser,这会抛出ClassCastException. 原因记录在源中;它将“仅适用于已编译的 XML 文件”,例如aapt工具打包的资源。

  • 添加了对此的请求:https://issuetracker.google.com/issues/62435069 (2认同)