0

嗨,我有一组 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;
        }

我使用上述方法缩小位图,效果很好。但我的问题是当我滚动网格时,视图被重绘并且流程不流畅,如何缓存这些位图以及如何延迟加载它们,这样我就不需要等待视图完全填充。

4

1 回答 1

1

为了节省内存,请始终将位图解码为您计划显示它们的相同大小。对于这个问题,官方文档是你最好的朋友。下载 BitmapFun 项目,了解如何正确执行此操作。https://developer.android.com/training/displaying-bitmaps/index.html

于 2013-02-01T17:43:41.830 回答