嗨,我有一组 SD 卡上图像的路径,所有图像都很大,如 1024*768 像素。
我需要在网格视图中显示所有这些图像,并使用相对按比例缩小的图像。我需要首先显示网格视图,然后加载生成的按比例缩小的图像。我怎样才能做到这一点。
现在是:
获取所有图像路径,
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;
}
我使用上述方法缩小位图,效果很好。但我的问题是当我滚动网格时,视图被重绘并且流程不流畅,如何缓存这些位图以及如何延迟加载它们,这样我就不需要等待视图完全填充。