我必须在我的应用程序上实现一个音乐厅的小地图。 它上面会有POI,我必须能够放大,移动它等等......
我做了一个使用转换为Picture的svg文件的类,我扩展了ImageView并覆盖了onDraw。
但是现在我必须用1.2Meg png做同样的事情,而我得到的只是内存错误..
我使用BitmapFactory.decodeResource, and then canvas.drawBitmap(bm, canvas.getMatrix(),null)
有人在某个地方有教程,或者只是告诉我我的方法有什么问题吗?
谢谢!
雷诺
答案 0 :(得分: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。