0

我必须在我的应用程序上实现一个音乐厅的小地图。它上面会有 POI,我必须能够缩放、移动等等......

我做了一个使用转换为图片的 svg 文件的类,我扩展了 ImageView 并覆盖了 onDraw。

但现在我必须对 1.2Meg png 做同样的事情,我得到的只是内存错误..

我用BitmapFactory.decodeResource, and then canvas.drawBitmap(bm, canvas.getMatrix(),null)

有人在某个地方有教程可以这样做,或者只是告诉我我的方法有什么问题?

谢谢 !

雷诺

4

1 回答 1

1

虽然 PNG 文件在磁​​盘上占用 1.2MB,但它会在内存中被解码为 RGB 位图,这会大得多。例如,一个 800x600 像素的 24 位 RGB 位图占用不到 1.4MB 的内存,而压缩为 PNG 时可能只有 30kB。

解决方案是仅渲染您当前可以在屏幕上看到的地图子部分。

为了使这更容易,您可以将源图像分割成恰好是屏幕大小的 1/4 的块。这样可以确保在任何时候加载到内存中的这些较小图像中的数量都不超过 9 个:

+--+----------+--------+
|1 |    2     |   3    |
+--+----------+--------+
|  |          |        |
|4 |    5     |   6    |
|  |          |        |
|  |          |        |
+--+----------+--------+
|  |          |        |
|7 |    8     |   9    |
|  |          |        |
+--+----------+--------+

当图像完全对齐时,您只需要在内存中有 4 个图像。为了在滚动时进行优化,您可以在滚动方向上预取图像。

如果您的地图为 10000x10000 像素,而您的屏幕为 480x800,请将图像的边缘扩展为有一段时间或黑色(或您喜欢的任何背景颜色!)边缘,以便可以均匀分割。在这种情况下,您将使用 10080x10400。

于 2012-06-26T09:50:41.220 回答