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。
抱歉不行。除非您以编译资源的方式以某种方式编译 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工具打包的资源。
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |