android深入之UI(一)圖片

(一)創建圖片Bitmap的類型

BitmapFactory.Options代表Bitmap存儲的方式

ALPHA_8 只有alpha值,佔1字節
ARGB_4444 不推薦,ARGB各佔4bits,共佔2字節
ARGB_8888 默認保存方式,ARGB各佔8bits,共佔4字節
RGB_565 沒alpha值,共佔2字節


(二)Bitmap佔用內存大小

Android中一張圖片(BitMap)佔用的內存主要和以下幾個因數有關:圖片長度,圖片寬度,單位像素佔用的字節數。
一張圖片(BitMap)佔用的內存=圖片長度*圖片寬度*單位像素佔用的字節數
注:圖片長度和圖片寬度的單位是像素。

比如一張400*560的圖片,以ARGB_8888顯示,佔用內存爲400*560*4=869000字節。

也可以通過程序獲取Bitmap佔用內存

protected int bitmapSizeOf(Bitmap data) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
            return data.getRowBytes() * data.getHeight();
        }
        else {
            return data.getByteCount();
        }
    }


(3)Bitmap處理技巧

1.不加載Bitmap獲取圖片信息

BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                bmOptions.inJustDecodeBounds = true;
                BitmapFactory.decodeFile(path, bmOptions);
                int photoW = bmOptions.outWidth;
                int photoH = bmOptions.outHeight;
通過inJustDecodeBounds參數,設置不加載圖片,可以獲取到圖片寬高

2.圖片壓縮處理

InputStream is = this.getResources().openRawResource(R.drawable.pic);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
讀取 drawable 下名爲 pic 圖片的縮略圖,長度、寬度都只有原圖片的 1/2。圖片大小減少,佔用的內存自然也變小了。這麼做的弊端是圖片質量變差,inSampleSize 的值越大,圖片的質量就越差。

3.圖片格式轉換,降低內存消耗

BitmapFactory.Options opt = new BitmapFactory.Options();  
   opt.inPreferredConfig = Bitmap.Config.RGB_565;  
   opt.inPurgeable = true;  
   opt.inInputShareable = true;  
   // 獲取資源圖片  
   InputStream is = context.getResources().openRawResource(resId);  
   return BitmapFactory.decodeStream(is,null,opt);  
相比ARGB_8888加載方式,內存消耗降低一半。
4.圖片不需要繼續使用即時回收

// 先判斷是否已經回收
if(bitmap != null && !bitmap.isRecycled()){ 
        // 回收並且置爲null
        bitmap.recycle(); 
        bitmap = null; 
} 
System.gc();
Bitmap類的構造方法都是私有的,所以開發者不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態方法來實例化一個Bitmap,生成Bitmap對象最終都是通過JNI調用方式實現的。所以,加載Bitmap到內存裏以後,包含兩部分內存區域的,一部分是Java部分的,一部分是C部分的。所以需要調用recycle()方法來釋放C部分的內存。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章