我的應用程序需要加載建築平面圖,然後在平面圖上繪製對象(傢俱)。平面圖是一個2500 x 1500 240Kb的PNG,但frackin'BitmapFactory通過需要12 + Mb的堆來創建位圖,導致我出現OutOfMemory錯誤,從而使大多數設備崩潰。讓我在這裏清楚一點:據我所知,這不是一個內存泄漏,bitmap.recycle()什麼也不做,因爲第一次創建第一個映像時它會崩潰。使用inSampleSize讀取圖像沒有幫助,除非我使用樣本大小來呈現圖像無法識別。這整個情況都很瘋狂。我正在測試Droid 3,HTC Inspire和兩個2.3仿真器。 HTC將載入地圖,模擬器的128Mb(可笑)堆大小也是如此。 這個應用程序的部署將用於Android用戶的範圍,所以我不能做任何針對高於2.3的設備。android-我應該使用GLSurfaceView而不是Canvas來避免bitmapfactory?
這裏是我當前的代碼,這給了我一個無法使用的圖像(從另一個SO職位,對不起,我已經失去了鏈接):
BitmapFactory.Options o=new BitmapFactory.Options();
o.inJustDecodeBounds=true;
BitmapFactory.decodeResource(getResources(), resourceId, o);
//Find the correct scale value. It should be the power of 2.
int scale=16;
while((o.outWidth/scale)>=REQUIRED_SIZE || (o.outHeight/scale)>=REQUIRED_SIZE)
scale*=2;
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = scale;
Bitmap base_image;
try {
base_image = BitmapFactory.decodeResource(getResources(), resourceId);
} catch (Error e1) {
base_image = BitmapFactory.decodeResource(getResources(), resourceId, options);
}
一會這裏GLSurfaceView解決我的問題?我需要它1)加載平面圖圖像,2)允許我以編程方式繪製對象和文本標籤,以及3)支持基於平面佈置圖座標的縮放和對觸摸作出反應。如果這是答案,任何人都可以推薦這樣的基本2D工作的好教程嗎?
提示:PNG的文件大小沒有任何意義,因爲它是壓縮的。在內存中使用時,每個像素都有(通常)32位或16位(4或3字節)。這意味着您的2500 x 1500圖像需要15兆字節的內存。 – Jave
對,我在另一個問題中發現。你如何建議我處理這種情況? – cschryer