Android图片优化,减少内存压力,提高app流畅度

    先上一张效果图:

这里写图片描述
第一个图片是原比例大小加载
第二张图片是imageview缩小一半后的加载效果
第三章是我们使用代码优化过的图片加载效果
显而易见,缩小imageview是不能真正的减少内存消耗。
想要优化图片我们可以通过第三种方式,即通过android的BitmapFactory.Options来达到我们的目的。按照一定的比例对原始图片进行缩放,然后我们的ImageView加载缩放后的图片,这样就会降低内存占用从而在一定程度上从而在一定程度上避免OOM,提高Bitmap加载时候的性能(Android艺术探究);

BitmapFactory.Options有一个参数:inJustDecodeBounds,他的类型为boolean,当我们设置inJustDecodeBounds = true,表示解码时只返回bitmap的宽高,并不会将bitmap加载到内存中。
还有一个有关的参数inSampleSize,取值为1、2、4、6、8…(2的倍数),比如当inSampleSize == 2 时,宽高为原来的1/2, 像素为原来的1/4,内存占用为原来的1/4. 结论:宽高缩放为1/inSampleSize, 像素和内存为(1/inSampleSize的二次方)
代码实现:

public static Bitmap decodFromResource(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 = calculateBitmapSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resid, options);
    }


    //计算Bitmap大小
    public static int calculateBitmapSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        final int width = options.outHeight;
        final int height = options.outHeight;
        int inSampleSize = 1;
        if (width > reqWidth || height > reqHeight) {
            final int halfWidth = width / 2;
            final int halfHeight = height / 2;
            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

完整的代码可以看我的github:https://github.com/luying6/BitmapConclusion/blob/master/app/src/main/java/com/bitmap/bitmapconclusion/BitmapLoadActivity.java
喜欢的可以star,后续会写一写图片压缩,编解码之类的,还有架构设计以及一些实用的小框架!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值