该开源库是一个用于图像加载处理的项目,项目的下载地址为:
https://github.com/nostra13/Android-Universal-Image-Loader
该库的特征有:
下面开始简单讲介绍该库的使用:
1.首先在上面提供的地址中下载库文件
2.在android studio的项目中导入jar包:我下载下来的文件有三个jar包分别是,universal-image-loader-1.9.5.jar,universal-image-loader-1.9.5-javadoc.jar,universal-image-loader-1.9.5-sources.jar,只需要导入第一个universal-image-loader-1.9.5.jar包。
3.在项目启动的时候初始化ImageLoader的配置。在这里编写了一个BaseApplication 继承自Application。在onCreate()函数中初始化ImageLoader相关配置:、
//在oncreate函数中调用
Context context=getApplicationContext();
init(context);
//init函数
public void init(Context context){
//设置缓存的目录
File cacheDir= StorageUtils.getOwnCacheDirectory(context,"imageLoader/Cache");
ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(400,400)//保存为文件的最大宽高
.threadPoolSize(3)//线程池加载数
.threadPriority(Thread.NORM_PRIORITY-2)//设置线程的优先级
.denyCacheImageMultipleSizesInMemory()//不缓存不同大小的同一图像
.memoryCache(new UsingFreqLimitedMemoryCache(2*1024*1024))//缓存的最大字节
// .memoryCacheSize(2*1024*1024)
.diskCacheSize(50*1024*1024)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())//保存文件名用hash加密
// .diskCacheFileNameGenerator(new Md5FileNameGenerator())//用MD5加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.diskCacheFileCount(50)//缓存文件数
.diskCache(new UnlimitedDiskCache(cacheDir))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(context,5*1000,30*1000))//设置连接超时时间和加载超时时间
.writeDebugLogs()
.build();//构建
ImageLoader.getInstance().init(configuration);//为ImageLoader初始化配置
}
4.开始使用ImageLoader,单例初始化的方式,然后使用ImageLoader进行图片显示:
ImageLoader imageLoader=ImageLoader.getInstance();
在调用imageLoader.displayImage()函数显示图片时,先要对显示参数进行设置,我使用了一个DisplayImageOptionsUtil类进行了封装:
public class DisplayImageOptionsUtil {
private static DisplayImageOptionsUtil util;
private DisplayImageOptions.Builder builder;
private DisplayImageOptionsUtil() {
builder = new DisplayImageOptions.Builder();
builder.cacheInMemory(true);//设置图片是否缓存在内存中
builder.cacheOnDisk(true);//设置图片是否缓存在SD上
builder.considerExifParams(true);//是否考虑图片Exif参数
/**imageScaleType: *EXACTLY :图像将完全按比例缩小的目标大小 *EXACTLY_STRETCHED:图片会缩放到目标大小完全 *IN_SAMPLE_INT:图像将被二次采样的整数倍 *IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小 *NONE:图片不会调整 */
builder.imageScaleType(ImageScaleType.EXACTLY_STRETCHED);
builder.bitmapConfig(Bitmap.Config.RGB_565);//设置图片解码类型
builder.resetViewBeforeLoading(true);//设置图片加载前重置
/**displayer(BitmapDisplay display) *RoundedBitmapDisplayer(int roundPixels)设置圆角图片 *FakeBitmapDisplayer()这个类什么都没做 *FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间 *SimpleBitmapDisplayer()正常显示一张图片 */
builder.displayer(new FadeInBitmapDisplayer(100));
}
public static DisplayImageOptionsUtil getInstance() {
if (util == null)
util = new DisplayImageOptionsUtil();
return util;
}
public DisplayImageOptions getDisplayImageOptions() {
return builder.build();
}
/** * 设置加载前显示的图片 * @param resId * @return this */
public DisplayImageOptionsUtil showImageOnLoading(int resId) {
if (resId > 0) builder.showImageOnLoading(resId);
return this;
}
/** * 设置加载前显示的图片 * @param drawable * @return this */
public DisplayImageOptionsUtil showImageOnLoading(Drawable drawable) {
if (drawable != null) builder.showImageOnLoading(drawable);
return this;
}
/** * 设置图像uri为空或者错误时显示的图片 * @param resId * @return this */
public DisplayImageOptionsUtil showImageForEmptyUri(int resId) {
if (resId > 0) builder.showImageForEmptyUri(resId);
return this;
}
/** * 设置图像uri为空或者错误时显示的图片 * @param drawable * @return this */
public DisplayImageOptionsUtil showImageForEmptyUri(Drawable drawable) {
if (drawable != null) builder.showImageForEmptyUri(drawable);
return this;
}
/** * 设置图片加载/解码出错显示的图片 * @param resId * @return this */
public DisplayImageOptionsUtil showImageOnFail(int resId) {
if (resId > 0) builder.showImageOnFail(resId);
return this;
}
/** * 设置图片加载/解码出错显示的图片 * @param drawable * @return this */
public DisplayImageOptionsUtil showImageOnFail(Drawable drawable) {
if (drawable != null) builder.showImageOnFail(drawable);
return this;
}
}
最后就可以使用imageLoader.displayImage进行图片加载显示
DisplayImageOptionsUtil util = DisplayImageOptionsUtil.getInstance();
util.showImageOnLoading(R.drawable.img_loading);
util.showImageForEmptyUri(R.drawable.img_loading_uri_err);
util.showImageOnFail(R.drawable.img_loading_fail);
imageLoader.displayImage(url,imageView, util.getDisplayImageOptions());
ImageLoader的displayImage方法有多种重载方式
1.使用默认配置显示,传递一个uri和用于显示图片的控件
public void displayImage(String uri, ImageView imageView) {}
2.加载自定义配置显示图片,也就是上面介绍的基本使用方法
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {}
3.带加载状态监听的方法
public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}
其中要实现ImageLoadingListener的这几个方法:
@Override
public void onLoadingStarted() {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
public void onLoadingCancelled() {
//加载取消的时候执行
}
4.加载状态监听以及加载进度监听
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}
ImageLoadingProgressListener需要实现的方法:
@Override
public void onProgressUpdate(String imageUri, View view, int current,int total) {
//在这里更新 ProgressBar的进度信息
}
关于Uri的写法:
网络图片:String uri=”http://…”
本地文件:String uri=“file://…”,可通过Environment.getExternalStorageDirectory()函数取得根目录
assets资源文件:String uri=”assets://…”
Drawable资源文件:String uri=”drawable://…