在 Android 中使用 SVG 作为图像视图的资源
Posted
技术标签:
【中文标题】在 Android 中使用 SVG 作为图像视图的资源【英文标题】:Using SVG as a resource of image view in Android 【发布时间】:2020-08-28 14:11:19 【问题描述】:我在使用 SVG 文件作为 imageView 的源文件时遇到问题。 我正在构建一个包含数千个 SVG 绘图的应用程序。当我将它们保存在可绘制文件夹中时它可以工作,但我不想最终得到一个巨大的 APK。当我从服务器将它们作为文件下载时,我无法将它们设置为图像视图的源(我尝试做与此类似的事情,但使用 SVG)
Bitmap temp = BitmapFactory.decodeFile("file path");
centerImage.setImageBitmap(temp);
但使用 SVG 文件(另存为 XML)。 我查看了整个 ***,但我看到的唯一解决方案是将其保存为资源,我更愿意避免这样做。
【问题讨论】:
【参考方案1】:不幸的是,在 android 上绘制 SVG 并不容易。我建议您将它们转换为AndroidVectorDrawable。您可以通过使用Android SVG to VectorDrawable 或在Vector Asset Studio 中逐个执行此操作。
【讨论】:
【参考方案2】:我最终是如何解决的(在 Amir MB 的帮助下): 我从服务器下载了 SVG 作为文件,我是如何使用该文件的,所以将它们放在 ImageView 中:
//file arrives from server
try
fileInputStream = new FileInputStream(file);
try
Bitmap bitmap = Bitmap.createBitmap(dummyImage.getWidth(),dummyImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
SVG svg = SVG.getFromInputStream(fileInputStream);
svg.setDocumentHeight(dummyImage.getWidth());
svg.setDocumentWidth(dummyImage.getHeight());
svg.renderToCanvas(canvas);
dummyImage.setImageBitmap(bitmap);
catch(SVGParseException S)
S.printStackTrace();
catch(IOException e)
e.printStackTrace();
【讨论】:
【参考方案3】:您可以从输入流中获取 SVG(可能在 AsyncTask
中)并将其转换为 Drawable
:
SVG svg = SVGParser.getSVGFromInputStream(inputStream);
Drawable drawable = svg.createPictureDrawable();
centerImage.setLayerType(View.LAYER_TYPE_SOFTWARE, null); //turnnig on software rendering
centerImage.setImageDrawable(drawable);
您也可以选择在 XML 中打开软件呈现:
android:layerType="software"
【讨论】:
你使用了什么 SVG 库?我正在使用另一个,我没有这些功能以上是关于在 Android 中使用 SVG 作为图像视图的资源的主要内容,如果未能解决你的问题,请参考以下文章
将 Lottie Android 与矢量图像 (xml) 或 svg 图像一起使用?