2011-07-12 44 views
0

我在Android中有一个绘图应用程序,允许用户用他们的手指进行绘制,然后将结果形状存储为Android Path s。为了允许用户删除他们绘制的单个的Path,我实现了this solution,其为每个Path使用边界Rect,然后使用内部多维二进制阵列来表示边界Rect内的像素。然后,我通过使用路径的控制点并沿着它使用二次贝塞尔曲线的数学方程来填充阵列,将阵列中的每个元素设置为其下的像素为1.Android路径碰撞问题/解决方案

使用上述设置,在擦除模式下,我首先检查用户手指与边界Rect之间的碰撞,如果碰撞,我然后检查用户触摸的像素是否设置为1。

现在,当用户加载一个音符时,我将所有的形状加载到'stroke'对象的一个​​ArrayList中,这样我就可以很容易地显示它们,并且可以循环遍历它们来检查擦除模式下的冲突。我还在自定义对象中存储了Rect和带有笔画的二进制数组。一切都按预期工作,但存储所有这些数据的内存占用空间,特别是每个路径的边界Rect的二进制数组越来越昂贵,并且当用户有大量笔画时,我得到的部分是java.lang.OutOfMemoryError我的代码是为每个笔画创建数组。

任何建议,以更好的方式来实现这一目标?本质上,我试图确定两个Android路径(绘图路径,然后是用户在擦除模式下创建的路径)之间的碰撞,而上述理论上工作时,实际上这是不可行的。

感谢,

保罗

回答

0

什么是 “二进制数组” 的实际表现?我认为如果你调整表示以反映你需要存储的实际数据(例如RLE对位进行编码:在这个y开始在这个x和z像素),你将能够存储你所需要的,没有过多的大小。

存储实际的字节数组,每个像素一个字节,或每8个像素(如果这就是你正在做的),这是不必要的。

另一种选择是根本不存储位图,只是控制点和边界框。如果触摸与边界框相交,则可以根据控制点即时计算位图。

+0

该表示法是位图的表示形式,因此该数组的类型为int,并且其维数为rect_width,rect_height。嗯,已经想过即时计算位图,但从性能的角度来看它可能太昂贵(尽管我可能没有选择,显然)。 RLE也可能工作,所以基本上,我会存储路径的RLE指令,当试图检测X点,Y点击Path时,我会沿着RLE追踪? –

+0

@Paul - 你有两个RLE选项;一个是为边界框中的每个y存储路径和y为(x,run_length)对象的交集(这是一条贝塞尔曲线,所以每个y将会有最多两个,我猜...) – antlersoft