Android应用程序应该最大限度地利用SVG吗?

时间:2016-08-30 13:44:52

标签: android performance user-interface svg

官方文档Vector Asset Studio指出SVG可用于减少APK大小。它还指出SVG需要很多CPU周期来绘制。

  

矢量图形的初始加载可能会花费更多的CPU周期   相应的光栅图像。之后,内存使用和性能   两者之间是相似的。我们建议您限制矢量   图像最大为200 x 200 dp;否则,可能需要很长时间   绘制。

此外,从Lollipop开始支持它。在向后兼容性方面,它指出 -

  

Android 4.4(API级别20)及更低版本不支持矢量绘图。   如果您的最低API级别设置为其中一个API级别,则可以   使用Vector Asset Studio时有两个选项:生成便携式网络   图形(PNG)文件(默认)或使用支持库。

     

为了向后兼容,Vector Asset Studio会生成栅格   矢量drawable的图像。矢量和光栅drawables是   在APK中打包在一起。

光栅图像看起来比SVG更有效。此外,尽管APK的大小将减少,但SVG对内存和应用程序性能的影响将会如同doc所述,它需要时间来绘制大型SVG文件。

作为Android开发人员,我的方法应该是什么?以上或任何其他方式将确保我的应用程序得到优化并提供良好的性能。

编辑:然后查询,这两者中最好的方法是什么 -

  1. 使用SVG减小apk大小,但会增加绘制的CPU周期
  2. 使用光栅图像

2 个答案:

答案 0 :(得分:1)

根据我自己的经验,Vector Asset Studio对它在SVG中接受的内容非常挑剔。如果您不熟悉SVG,那么您将很难将SVG标记按摩到VAS接受的内容。从我的头脑中我记得它不支持defsfilter,但是一些矢量图形软件似乎包括它,即使它不是绝对必要的。给定平面图标(例如,没有渐变或阴影),您可以通过手动编辑标记来解决此问题。

至于性能,它实际上取决于您将在每个屏幕上显示的图标数量以及这些图标的复杂程度。您将不得不进行一些压力测试,以查看您的目标设备是否支撑。请注意,这只会影响初始加载,在幕后这些矢量图像被栅格化,并且如您引用的文字所述:Afterward, memory use and performance are similar between the two

您的方法应该是务实的,尝试在屏幕上绘制几个图标,看看它的顺畅程度。这是一个主观问题,取决于设备的约束和实现它的人。

答案 1 :(得分:0)

我使用react-native-svg的经验非常好,但是需要重新计算动态SVG的动画效果受到了影响我觉得他们称之为'too many passes over the bridge'。可能有一种方法可以优化它,我打算在我的下一个RN项目中进行调查。我应该通过强调动画只有在动画期间需要重新计算SVG(在JS方面)时才能使这个动画合格。例如,有一个带有SVG的原生ScrollView组件,ScrollView可以完美地生成动画,但是如果你想以编程方式更改SVG作为React / JS端内滚动位置的函数,你将遇到桥接问题,并且大量丢帧。

这是我的样板,它在Android RN中设置了一些基本形状: proto__33__boilerplate

一般来说,我会说(程序化)SVG对Android很有用,但我还没有找到一种高效的方法来将它们用于动画。如果我发现,会更新。