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

加载图片的优化策略

作者: 使劲挤海绵 | 来源:发表于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