0
嗨,我有一組SD卡上的圖像路徑,所有的圖像都很大,如1024 * 768像素。網格視圖中的延遲加載圖像解碼從SD卡的圖像路徑
我需要在網格視圖中顯示所有這些圖像並縮小圖像。我需要先顯示網格視圖,然後加載一個生成的縮小圖像。我怎樣才能做到這一點。
這裏現在是:
讓所有圖像路徑,
File imgFile = new File(pathToImageOnSD);
if (imgFile.exists()) {
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize = 4;
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
item.bitmap = myBitmap;
imageview.setImageBitmap(myBitmap);
}
我做這行的每個圖像路徑,和我一起內存出錯而結束。有庫來從url加載圖像,但我需要一個類似的加載SD卡上的本地圖像。
編輯:
public Bitmap loadBitmapFromPath(File f) {
// decodes image and scales it to reduce memory consumption
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, o);
stream1.close();
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
if (scale >= 2) {
scale /= 2;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我用上面的方法來縮小位圖,它的工作完美。但我的問題是,當我滾動網格的意見重繪和流動不平滑,如何緩存這些位圖和如何延遲加載它們,以便我不需要等待視圖完全填充。
嗨@krylez感謝您的回覆它修復了我的問題的一部分..我編輯了更新的問題。 – sukarno
BitmapFun項目回答你所有的問題。它演示瞭如何異步獲取圖像以及如何高效地緩存圖像。花點時間閱讀一下,真正理解它。 – Krylez
是的,你是對的,樣品有一切,但我只需要使我的工作的一部分,並不能理解一些事情,如果你能解釋我樣品我可以使用哪些類會更好。在此先感謝您的答覆並接受 – sukarno