美文网首页
加载图片的优化策略

加载图片的优化策略

作者: 使劲挤海绵 | 来源:发表于2018-04-11 11:31 被阅读15次
  • 使用LruCache进行缓存
    • LruCache(int maxSize):该缓存空间所能存放的最大大小;
    • sizeOf():返回的大小,代表即将要加入缓存中的对象的大小;
      可以通过函数 Cache.size()来查看当前缓存已经存储的大小,
      Cache.size()/Cache.sizeOf() = cacheEntry的个数
    • 因此 1.2两点中的size的单位要保持一致,
public void testLruCache() {
    LruCache<String, String> cachde = new LruCache<String, String>(10) {
       @Override
       protected int sizeOf(String key, String value) {
          return 5;
       }
  };
}
  • 使用加载略缩图的形式

public class BitmapUtils {


    // 从Resources中加载图片
    public static Bitmap decodeSampledBitmapFromResource(Resources res,
            int resId, int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options); // 读取图片长款
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight); // 计算inSampleSize
        options.inJustDecodeBounds = false;
        Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载入一个稍大的缩略图
        return createScaleBitmap(src, reqWidth, reqHeight); // 进一步得到目标大小的缩略图
    }

    // 从sd卡上加载图片
    public static Bitmap decodeSampledBitmapFromFd(String pathName,
            int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(pathName, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        Bitmap src = BitmapFactory.decodeFile(pathName, options);
        return createScaleBitmap(src, reqWidth, reqHeight);
    }
}



    private static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

    // 如果是放大图片,filter决定是否平滑,如果是缩小图片,filter无影响
    private static Bitmap createScaleBitmap(Bitmap src, int dstWidth,
            int dstHeight) {
        Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false);
        if (src != dst) { // 如果没有缩放,那么不回收
            src.recycle(); // 释放Bitmap的native像素数组
        }
        return dst;
    }
}




相关文章

网友评论

      本文标题:加载图片的优化策略

      本文链接:https://www.haomeiwen.com/subject/ezeahftx.html