2012-06-26 51 views
0

我必須在我的應用程序上實現一個音樂廳的小地圖。 它將有POI,我必須能夠縮放,移動等等...POI自定義地圖

我做了一個類與svg文件轉換爲圖片,我擴展ImageView和覆蓋onDraw。

,但現在我必須做同樣的一個1.2Meg PNG和我得到的是內存錯誤..

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

是否有人有教程的地方這樣做,或者只是告訴我我的方法有什麼問題?

謝謝!

雷諾

回答

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。

+0

哼哼,但是開始時的縮放/取消縮放,屏幕上顯示的是entier png,我是否必須擁有不同質量的多個源,並根據我的縮放功能切換源(縮放,無按鈕) –

+0

您可以支持固定縮放級別。爲每個級別生成一組圖像,其中最高級別是整個圖像的縮小版本,下一級別是兩倍或三倍大小等等。 – Polynomial