SVG转换 - 存储Path,Paint和Matrix对象的有效方法?

时间:2011-04-26 18:30:49

标签: android svg

在我的Android应用程序中,我创建了一个SVG图像转换器类。它解析SVG XML数据并将其转换为适当的Path,Paint和Matrix对象,然后将其应用于Canvas。然后使用这个类我实现了一个View,它使用我的SVG转换器类在屏幕上绘制我在Inkscape中生成的图像。到现在为止还挺好。 (我很欣赏编写我自己的SVG转换器可以考虑重新使用它,考虑到它之前已经完成,但对我来说,这是我第一个Android应用程序中的一个有用的学习练习,并希望能给我一些额外的灵活性。)

使用SVG的目的是让我可以快速轻松地编写各种图形规格设计。每个仪表通常由一段图形组成,只需要绘制一次(例如仪表面和图例),以及定期更新的图形(指针角度,数值文本)。

目前我的仪表View效率不高,因为每次调用onDraw()时,都会调用我的SVG类来调整整个SVG文件,以生成Canvas的所有矢量数据。

我想要做的是对矢量数据进行一些中间存储,以便只需要解析一次SVG XML文件。因此,我认为View可以在第一个onDraw()上从SVG文件中进行惰性初始化,然后将所有生成的Paths,Paint和Matrix对象存储到各种列表中。然后,在每个后续的onDraw()上,我只是将它们从List中拉出来,并通过那些进入Canvas。

这样做的另一个优点是使用单独的列表来存储“移动”的矢量图形部分,例如,仪表指针。我想通过为Inkscape中代表指针的路径组分配一个“魔术”ID来做到这一点;然后,SVG解析器类将识别出该单独的组需要单独存储到“静止”图形中。然后,每当我需要根据测量数据刷新指针的角度时,View将仅将旋转变换应用于该束矢量数据。事实上,我正在考虑这样做,以便移动指针图形实际上是在子视图中绘制的,这样只有在必须刷新指针时才重绘子视图。

所有这一切的最终目标是:我(或者甚至用户)可以启动像Inkscape这样的矢量成像程序,并快速生成仪表小部件的新设计。我嵌入了一些元数据来指示必须根据测量数据操作哪些图形位。

我不想要求解决这样的问题,而是希望听到关于我在这里做什么的意见,以及我提出的建议是否可以以更加优化的方式完成。缓存Path和Paint对象组是否内存效率非常低?

此外,一旦它足够好(!)我很乐意在某个地方发布我的SVG类,如果有人发现它有用的话。

1 个答案:

答案 0 :(得分:2)

实施和衡量! 从简单的方法开始 - 将解析后的矢量数据存储在内存中的列表中。如果内存使用和渲染速度可以接受:问题解决了。 如果没有,请尝试其他事情并衡量。一些想法:

  • 解析SVG一次,渲染一次到Bitmaps,重用位图
  • 将SVG渲染为构建过程的一部分,使用app
  • 发送栅格位图

除了最简单的情况,我们对评估特定技术的效果并不是很好。因此,流行的说法过早优化是万恶之源