BitmapUtils支持对三种形式的图片资源进行加载,
分别是assets图片,sdcard图片和网络图片,使用LRU(最近最少使用算法),
通过磁盘缓存,程序缓存来避免OOM问题.
对于res里的图片,程序运行时就加载在内存中了,所以没必要使用BitmapUtils了
据作者解释,BitmapUtils没有采用单例模式,这样可以采用不同的默认配置来加载不同的图片.
BitmapUtils一共有两种配置BitmapGlobalConfig和BitmapDisplayConfig
BitmapGlobalConfig主要配置磁盘缓存路径,程序缓存大小(这个大小在源码中有限制),
BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败的图片,显示图片的最大Size,
加载图片动画,图片是否翻转,是否显示原图(不建议使用)等.
具体配置可以查看BitmapUtils中的源码,但是我本人觉得没有必要自己配置,默认的就挺好的.
除此之外,我们可以给被加载的图片增加BitmapLoadCallBack,接收图片加载的各种状态,从而增加自己的处理:
testBitmapUtils.display(testImageView, "assets/img/wallpaper.jpg",new BitmapLoadCallBack<View>(){......});
以下是BitmapLoadCallBack的接口定义:
分别是assets图片,sdcard图片和网络图片,使用LRU(最近最少使用算法),
通过磁盘缓存,程序缓存来避免OOM问题.
对于res里的图片,程序运行时就加载在内存中了,所以没必要使用BitmapUtils了
据作者解释,BitmapUtils没有采用单例模式,这样可以采用不同的默认配置来加载不同的图片.
BitmapUtils一共有两种配置BitmapGlobalConfig和BitmapDisplayConfig
BitmapGlobalConfig主要配置磁盘缓存路径,程序缓存大小(这个大小在源码中有限制),
BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败的图片,显示图片的最大Size,
加载图片动画,图片是否翻转,是否显示原图(不建议使用)等.
具体配置可以查看BitmapUtils中的源码,但是我本人觉得没有必要自己配置,默认的就挺好的.
下面是BitmapUtils简单的使用:
BitmapUtils bitmapUtils = new BitmapUtils(this);
// 加载网络图片
bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
// 加载本地图片(路径以/开头, 绝对路径)
bitmapUtils.display(testImageView, "/sdcard/test.jpg");
// 加载assets中的图片(路径以assets开头)
bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
// 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
除此之外,我们可以给被加载的图片增加BitmapLoadCallBack,接收图片加载的各种状态,从而增加自己的处理:
testBitmapUtils.display(testImageView, "assets/img/wallpaper.jpg",new BitmapLoadCallBack<View>(){......});
以下是BitmapLoadCallBack的接口定义:
public abstract class BitmapLoadCallBack<T extends View> {
/**
* Call back when start loading.
*
* @param container
* @param uri
* @param config
*/
public void onPreLoad(T container, String uri, BitmapDisplayConfig config) {
}
/**
* Call back when start loading.
*
* @param container
* @param uri
* @param config
*/
public void onLoadStarted(T container, String uri, BitmapDisplayConfig config) {
}
/**
* Call back when loading.
*
* @param container
* @param uri
* @param config
* @param total
* @param current
*/
public void onLoading(T container, String uri, BitmapDisplayConfig config, long total, long current) {
}
/**
* Call back when bitmap has loaded.
*
* @param container
* @param uri
* @param bitmap
* @param config
*/
public abstract void onLoadCompleted(T container, String uri, Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from);
/**
* Call back when bitmap failed to load.
*
* @param container
* @param uri
* @param drawable
*/
public abstract void onLoadFailed(T container, String uri, Drawable drawable);
private BitmapSetter<T> bitmapSetter;
public void setBitmapSetter(BitmapSetter<T> bitmapSetter) {
this.bitmapSetter = bitmapSetter;
}
public void setBitmap(T container, Bitmap bitmap) {
if (bitmapSetter != null) {
bitmapSetter.setBitmap(container, bitmap);
} else if (container instanceof ImageView) {
((ImageView) container).setImageBitmap(bitmap);
} else {
container.setBackgroundDrawable(new BitmapDrawable(container.getResources(), bitmap));
}
}
public void setDrawable(T container, Drawable drawable) {
if (bitmapSetter != null) {
bitmapSetter.setDrawable(container, drawable);
} else if (container instanceof ImageView) {
((ImageView) container).setImageDrawable(drawable);
} else {
container.setBackgroundDrawable(drawable);
}
}
public Drawable getDrawable(T container) {
if (bitmapSetter != null) {
return bitmapSetter.getDrawable(container);
} else if (container instanceof ImageView) {
return ((ImageView) container).getDrawable();
} else {
return container.getBackground();
}
}
}
以下是BitmapUtils的关键函数:
public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack) {
if (container == null) {
return;
}
if (callBack == null) {
callBack = new DefaultBitmapLoadCallBack<T>();
}
if (displayConfig == null || displayConfig == defaultDisplayConfig) {
displayConfig = defaultDisplayConfig.cloneNew();
}
// Optimize Max Size
BitmapSize size = displayConfig.getBitmapMaxSize();
displayConfig.setBitmapMaxSize(BitmapCommonUtils.optimizeMaxSizeByView(container, size.getWidth(), size.getHeight()));
container.clearAnimation();
if (TextUtils.isEmpty(uri)) {
callBack.onLoadFailed(container, uri, displayConfig.getLoadFailedDrawable());
return;
}
// start loading
callBack.onPreLoad(container, uri, displayConfig);
// find bitmap from mem cache.
Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri, displayConfig);
if (bitmap != null) {
callBack.onLoadStarted(container, uri, displayConfig);
callBack.onLoadCompleted(
container,
uri,
bitmap,
displayConfig,
BitmapLoadFrom.MEMORY_CACHE);
} else if (!bitmapLoadTaskExist(container, uri, callBack)) {
final BitmapLoadTask<T> loadTask = new BitmapLoadTask<T>(container, uri, displayConfig, callBack);
// get executor
PriorityExecutor executor = globalConfig.getBitmapLoadExecutor();
File diskCacheFile = this.getBitmapFileFromDiskCache(uri);
boolean diskCacheExist = diskCacheFile != null && diskCacheFile.exists();
if (diskCacheExist && executor.isBusy()) {
executor = globalConfig.getDiskCacheExecutor();
}
// set loading image
Drawable loadingDrawable = displayConfig.getLoadingDrawable();
callBack.setDrawable(container, new AsyncDrawable<T>(loadingDrawable, loadTask));
loadTask.setPriority(displayConfig.getPriority());
loadTask.executeOnExecutor(executor);
}
}