Android Studio导入SVG后预览黑屏且崩溃,报XML格式错误
哦,这个问题我碰到过好多次了!核心问题出在你搞混了Android Vector Drawable和原始SVG文件的区别,还选错了解析工具。
问题根源
你用Android Studio导入SVG后,它自动把原始SVG转换成了Android专属的<vector>格式的Vector Drawable XML——这是Android用来渲染矢量图的专用格式,不是标准SVG。但你却用SVGParser.getSVGFromResource()去解析它,这个工具是用来解析原始SVG文件的,根本不认识Android的Vector语法,所以才会抛出“not well-formed”的解析错误。至于预览黑屏,大概率是Vector Drawable的预览配置问题,但崩溃的核心原因绝对是解析工具不对。
解决方案分两种情况:
情况1:只是要显示这个矢量图,不需要解析内容
这是最常见的场景,完全不用碰SVGParser,直接用Android原生方式加载Vector Drawable就行:
- 在布局文件里直接给ImageView设置src:
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/chde4" /> - 或者在代码里设置:
另外,如果你的minSdkVersion低于21,记得在Module级别的ImageView imageView = findViewById(R.id.your_image_view); imageView.setImageResource(R.drawable.chde4);build.gradle里添加支持:
这样调整后,预览也会正常显示,不会再黑屏。android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
情况2:确实需要解析SVG的内容(比如动态修改路径)
那你不能让Android Studio把SVG转成Vector Drawable,要保留原始SVG文件:
- 在
res目录下新建raw文件夹(如果没有的话) - 把你的原始SVG文件直接复制到
res/raw目录下(不要通过Android Studio的导入功能,直接复制粘贴) - 然后用
SVGParser从raw目录读取输入流来解析:
用原始SVG文件解析,就不会有格式不兼容的问题了。try { InputStream inputStream = getResources().openRawResource(R.raw.chde4); SVG svg = SVGParser.getSVGFromInputStream(inputStream); // 接下来就可以操作svg对象了 } catch (IOException e) { e.printStackTrace(); }
额外提示
如果你想操作Android Vector Drawable的内容(比如修改路径颜色、形状),可以直接用Android的VectorDrawable类,不需要用SVGParser:
VectorDrawable vectorDrawable = (VectorDrawable) getDrawable(R.drawable.chde4); // 比如获取路径组 Drawable.ConstantState state = vectorDrawable.getConstantState(); if (state instanceof VectorDrawable.VectorDrawableConstantState) { VectorDrawable.VectorDrawableConstantState vectorState = (VectorDrawable.VectorDrawableConstantState) state; List<VectorDrawable.PathInfo> paths = vectorState.getPaths(); // 这里可以修改路径的属性 }
内容的提问来源于stack exchange,提问作者Patrik Eichmann
相关产品推荐
相关产品推荐

