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

时间:2022-10-12 21:12:15
    先上一张效果图:

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,后续会写一写图片压缩,编解码之类的,还有架构设计以及一些实用的小框架!