此文 可以處理低端設備加載圖片,還可以優化圖片的加載 從而提高app的工作效率 最終提高用戶的舒適度
加載bitmap 當設備的堆棧內存較小而且bitmap.jpg較大的時候,用下面的代碼內存溢出。
Bitmap bp=BitmapFactory.decodeFile("sdcard/bitmap.jpg"); ImageView imageView=(ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(bp);
|
測試時的信息:設備內存是16M 圖片1.73M。
此時LogCat信息:
我們會發現是內存溢出了,可下面的代碼似乎沒有任何問題,其實的確沒有任何問題。
Bitmap bp=BitmapFactory.decodeFile("sdcard/bitmap.jpg"); ImageView imageView=(ImageView) |
最主要的提示信息其實在(LogCat)上面,內容如下:
內存溢出的原因是:
30720012 byte=29 M
也就是說圖片加載申請了29M的內存遠大於設備的16M內存
解析:
29M是計算機把所有的像素信息(像素個數*像素佔用空間大小*4+其他信息)解析出來的保存至內存的大小(4是因爲Android是按照ARGB保存)
解決辦法:
按照屏幕寬高來縮放
// 點擊按鈕開始加載 publicvoid load(View view) {
// Options 這個類裏Google封裝瞭解析圖片的所有參數 Options opt = new Options();
// 設置爲只讀取照片寬高等其他信息,不讀取內容 opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/bitmap2.jpg", opt); // 取得照片寬高 intimgH = opt.outHeight; intimgW = opt.outWidth; // 獲取屏幕寬高 Display display = getWindowManager().getDefaultDisplay(); // 由於本Demo是爲了解決低端機加載圖片內存溢出,所以還用老方法,不用最新的方法取寬高 intscreenW =
display. intscreenH =
display. // 設置默認縮放比例爲1 intscale = 1; // 取得寬高縮放比例 intscaleW = imgW / screenW; intscaleH = imgH / screenH;
// 讓縮放比例爲寬高中比例較大的 if (scaleW >= scaleH && scaleW > 1) { scale = scaleW; } elseif (scaleW <= scaleH && scaleH > 1) { scale = scaleH; } // 設置爲讀取照片全部信息 opt.inJustDecodeBounds = false; // 按照比例縮放 opt.inSampleSize = scale; Bitmap bp = BitmapFactory.decodeFile("sdcard/bitmap2.jpg", opt); ImageView imageView = (ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(bp); } |
圖片大小的原理: