譯者按: 在Google最新的文檔中,提供了一系列含金量相當高的教程。因為種種原因而鮮為人知,真是可惜!Ryan將會細心整理,將之翻譯成中文,希望對開發者有所幫助。
本系列是Google關於展示大Bitmap(位圖)的官方演示,可以有效的解決內存限制,更加有效的加載並顯示圖片,同時避免讓人頭疼的OOM(Out Of Memory)。
【Google官方教程】系列相關閱讀: http://www.linuxidc.com/search.aspx?where=nkey&keyword=14914
-------------------------------------------------------------------------------------
譯文:
圖像可以有各種各樣的形狀和大小。在很多情況下,它們往往會比典型的應用UI界面所需要的更大。例如,系統的Gallery程序展示使用Android設備的攝像頭拍攝的照片的分辨率往往要遠高於設備的屏幕密度。
考慮到你所使用的內存有限,理想的情況是你只會想加載一個分辨率相對較低的圖片到內存中來。低分辨率版本的圖片與相應UI組件的尺寸應該是相匹配的。一張高分辨率的圖片並不能帶給你任何可見的好處,卻要占據著寶貴的內存,以及間接導致由於動態縮放引起額外性能開銷。
這節課將向你演示如何解碼大圖片,通過加載較小的圖片采樣以避免超出應用的內存限制。
讀取Bitmap(位圖)的尺寸和類型
BitmapFactory提供了幾種解碼方式(decodeByteArray(), decodeFile(), decodeResource()等等),以便從多種資源中創建一個Bitmap(位圖)對象。可以根據你的圖片數據來源選擇最合適的解碼方式。這些方法視圖為構造Bitmap對象分配內存,因此很容易導致OutOfMemory(OOM)異常。每一種解碼方式都有額外的特征,你可以通過BitmapFactory.Options類類指定解碼方法。在解碼圖片的時候設置inJustDecodeBounds屬性為true,可以避免內存分配,返回的bitmap對象為null卻可以設置outWidth, outHeight和outMimeType。這項技術允許你在創建Bitmap(並分配內存)之前讀取圖片的尺寸和類型。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
為了避免java.lang.OutOfMemeory異常,在解碼圖片之前就要檢查圖片的尺寸,除非你十分確信圖片資源的尺寸是可預見的並且有著充裕的可用內存。
將縮小版的圖片加載到內存中
現在圖片的尺寸已經知道了,這些信息可以用來決定是將一個完整尺寸的圖片加載到內存中,還是應該用一個圖片的子樣本來取代它。這裡有一些可供考慮的因素:
例如,如果最終只是要在ImageView中顯示一張128*96px大小的縮略圖,直接加載1024*768px的圖片是非常不值得的。