存储手写的最佳策略

时间:2010-12-29 01:43:37

标签: android vector vector-graphics handwriting

我正在编写一个移动应用程序(Android),允许用户使用1像素精度的单点触控设备“写入”画布。该应用程序将在平板设备上运行,该设备大约标准尺寸为8 1/2“x 11”。我的策略是将“文本”存储为矢量数据,因为输入设备的每个笔划基本上都是一个由起点和终点组成的矢量,以及一些有助于定义形状的中间点。矢量(由触摸屏上的触摸屏/ OS生成)。这应该允许我跟踪笔画放下的顺序(支持撤消等),并且足够灵活,允许重新调整文本大小等,就像任何其他矢量图形一样。

然而,做一些非常粗略的信封计算,使用高度准确的输入设备和大屏幕,这样你就可以一对一地模拟标准纸质记事本,这意味着你将有每个约1,700个笔画整页文字。最坏的情况是,每个笔画可以由最多约20-30个单独的点组成(每个像素的一个点左右),这意味着每页约50,000个数据点...对于SQLite来说太大了/ Android可以在重新加载页面并重新创建矢量笔划时处理任何期望的可靠性(我必须想象从SQLite数据库中提取50,000多个结果将超过CursorWindow limit of 1Mb

我知道我可以将数据检索分解为多个查询,或者可以修改笔划数据,这样我只需添加一个中间点来帮助定义笔划矢量形状,如果它从开始,结束或超过X像素其他中间像素,但我想知道我是否需要从头开始重新考虑这个策略......

有关如何以更有效的方式解决此问题的任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

首先使用矢量数据有什么理由吗?在不知道您的其他要求的情况下,在我看来,您只需要将数据存储在栅格/位图中并使用常规压缩方法(如PNG / zip / djvu)进行压缩(或者如果性能受损,则可以使用简单的操作,例如运行长度编码/ RLE)。

编辑:抱歉,我没有清楚地阅读这个问题。但是,如果您只需要“撤消”和“调整大小”等内容,则可以为每个笔划拍摄位图的快照(当然,您只需拍摄更改区域的快照)。

也可以采用混合方法,在等待(实际)矢量图像加载的同时首先显示快照位图。

此外,我不熟悉android游标限制,但是SQL查询总是可以重写以将结果拆分(通过LIMIT ... OFFSET)。

答案 1 :(得分:0)

我现在正在使用的解决方案,虽然我愿意接受任何进一步的建议!

  1. 创建一个画布视图,既可以将SVG路径转换为Android路径,也可以截取运动事件,将它们转换为android Paths,同时将它们存储为SVG路径。
  2. 在onDraw()
  3. 中显示指向屏幕的Android路径
  4. 将SVG路径写入.svg文件