Bitmap的加载和Cache-学习笔记1

图片的缓存策略(通过缓存策略不需要每次都从网络上请求图片后者从存储设备中加载图片):

  常见的缓存策略是:LruCache和DiskLruCache,其中LruCache常被用做内存缓存,而DiskLruCache常被用做存储缓存。

Lru是Least Recently Used的缩写,即最近最少使用算法:当缓存快满时,会淘汰近期最少使用的缓存目标。

 

Bitmap的高效加载:

  1.如何加载一个Bitmap:

     Bitmap在Android中指的是一张图片,可以是png、jpg等图片格式;BitmapFactory类提供了四类方法:decodeFile、DecodeResource、decodeStream和decodeByteArray,

decodeFile-----从文件系统中加载出一个Bitmap对象

DecodeResource-----从资源中加载出一个Bitmap对象

decodeStream-----从输入流中加载出一个Bitmap对象

decodeByteArray-----从字节数组中加载出一个Bitmap对象

其中decodeFile和decodeResource又间接调用了decodeStream方法,这四类方法在底层实现。

  2.高效加载Bitmap

     (1)采用BitmapFactory.Options来加载所需尺寸的图片,可以按一定的采样率来加载缩小后的图片,将缩小后的图片在ImageView中显示,能降低内存占用并一定程度上避免OOM,挺高了

Bitmap加载时的性能,1中的BitmapFactory四类方法都支持BitmapFactory.Options参数。

     (2)获取采样率流程:

             a.将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片--只会解析图片的原始宽/高信息,并不会真正地加载图片

             b.从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于onWidth和outheight参数

             c.根据采样率的规则并结合目标View的所需大小计算出采样率inSampleSize

             d.将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//设为true并加载图片
BitmapFactory.decodeResource(res, resId, options);

options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);//取出原始宽高

options.inJustDecodeBounds = false;

return BitmapFactory.decodeResource(res, resId, options);//重新加载
}

public 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;//2的次方 采样率
}
}
return inSampleSize;
}
实际使用(所期望的图片大小为100x100像素):
mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResource(),R.id.myimage,100,100));
posted @ 2017-05-16 16:16  Calo-missile  阅读(190)  评论(0编辑  收藏  举报