在 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 作为图像视图的资源的主要内容,如果未能解决你的问题,请参考以下文章

在android中动态改变SVG图像颜色

如何使用 Glide 将 svg 图像加载到图像视图

将 Lottie Android 与矢量图像 (xml) 或 svg 图像一起使用?

使用 SVG(作为 PDF)的自定义 UITabBarItem 图像在 Xcode ios 中应该是啥尺寸?

o'Reill的SVG精髓(第二版)学习笔记——第二章

如何将图像作为墙砖放置在 svg 路径中