适用于极宽画布的Android选项

时间:2012-10-23 00:42:54

标签: android

我一直试图让一个非常大的画布工作几天。

将所有内容添加到画布后,画布的宽度有时为30,000,但如果将此代码添加到ondraw方法,则滚动浏览变得非常慢。

然后我尝试将所有内容添加到位图,然后在onDraw方法中绘制位图。虽然这对于较小的位图工作得很好,但是对于30,000宽的位图,我的内存错误会出错。

任何人都可以建议一个解决方案,我不知道现在该尝试什么。

由于

编辑我也尝试将位图更改为Config.RGB_565,但仍然会出现内存错误。

4 个答案:

答案 0 :(得分:5)

处理大型Canvas将不断遇到OutOfMemoryExceptions。 Canvas写入一个Bitmap,而像X Bitmap这样的30,000就会占用大量内存。我认为你最好的选择是跟踪可见屏幕相对于你想要显示的位置,并且只写入画布所需的内容。

例如,如果用户向下和向左滚动100个像素,那么对于1024 x 768显示,在画布中绘制将在1124和868显示的虚拟30,000 x 30,000画布中显示的内容(您不会全部画出来。)

答案 1 :(得分:1)

您在ArrayList中有多少个条目,它看起来非常大。

根据我的理解,你在onDraw()中绘制所有内容时没有OoM问题,但它真的很慢?如果是这种情况,最相似的原因是你正在调用大量的 drawText ,这是非常慢,基本上如果你有10000个字符串来绘制,系统必须测量它们中的每一个,以便确定给定的String是否在大画布上可见,然后实际的绘图部分也很慢。

您可以测试绘制所有文本所花费的时间,看看是否是这种情况。

如果确实如此,那么最简单的方法是将每个字符/数字映射到位图,您可以让艺术家创建PNG文件,或者在 onCreate中绘制您需要的每个唯一字符( Bundle)或其他一些名为once-per-Activity的创建方法,将位图放在String-to-Bitmap HashMap中,而不是调用

canvas.drawText(bellNumber, xPad, mOriginY, paint); 

你打电话给

canvas.drawBitmap(hash.get(bellNumber), src, dst, paint); //remember to reuse src & dst

这将完全绕过String相关的绘图开销,并且应该使你的onDraw操作更快。

答案 2 :(得分:1)

位图的大小有限,具体取决于设备 - 但通常取决于特定设备的大小。此外,位图是为基于sdk的应用程序创建内存泄漏的主要方法之一。您最好的选择是将画布分成较小的部分,或者考虑其他选项,例如在openGL中渲染画布(这也有尺寸限制,但通常渲染速度更快)。

答案 3 :(得分:0)

Flynn81总体上有一个很好的答案。看看你的行逻辑,我会做一些数学运算并尝试预测需要绘制哪些行。由于您正在处理文本,因此可以获取字体度量(测量文本)。由于您似乎正在处理数字,因此您可以尝试测量字符串的高度,如“0123456789”。

您可能想对此进行分析,但您可以缓存线条图。

如果你真的很勇敢,你可以尝试使用ListView和自定义可绘制类型