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

Tre*_*vor 6 svg android

在我的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类,如果有人发现它有用的话.

Pēt*_*une 2

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

  • 解析 SVG 一次,渲染一次位图,重用位图
  • 将 SVG 渲染为构建过程的一部分,使用应用程序发送光栅位图

除了最简单的情况外,我们不太擅长评估特定技术的有效性。因此流行一句话:过早的优化是万恶之源