在请求图片时,往往会涉及到对图片的二次采样处理,包括图片的大小,显示的样式(圆角,矩形),甚至时缓存处理,相信大家也接触过很多类似的需求,个人感觉Universal-Image-Loader在这方面做的还是比较人性化的,不需要开发者去做过段繁琐的代码操作,简单易用,所以今天打算跟大家分享下这款强大的图片加载框架,其实图片请求框架网上好多,个人感觉用熟一个就行,其他一通百通,没必要把所有的都搞一遍,题外话到此截止,接下来进入正文,我由浅入深都跟大家分享下universal-image-loader的具体使用细节,在文章的最后我会为大家简单封装一个图片请求的工具类,供大家参考。
我把整个过程细分成四步,然后在每一步分别为大家讲解下要做的工作。
第一步:导包引资源还有配置网络权限我就不具体说了,这个留给大家自己来做
第二步:接下来也是比较重要的一步,配置全局的ImageLoaderConfigraution参数,参数配置全局有效,建议放在Application里面配置,如多次配置默认使用的是第一次的配置参数:
一般我会把这一初始化的过程放在Application里面,全局使用,对于需要展示不同样式的图片风格可以在dispalyImage方法中通过传入不同的options来处理,不传入options的话,则使用默认的options展示样式。
// 创建默认的ImageLoader配置参数
DisplayImageOptions defaultOptions = new DisplayImageOptions
.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration
.Builder(mAppContext)
.defaultDisplayImageOptions(defaultOptions)
.threadPriority(Thread.NORM_PRIORITY - 2)
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.build();
第三步:配置完参数接下来要做的工作初始化ImageLoader
ImageLoader.getInstance().init(configuration);
1.显示圆角:
//显示圆角
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.displayer(new RoundedBitmapDisplayer(360)) //设置展示的样式
.build();
ImageLoader.getInstance().displayImage(url, this,options);
2.默认不处理,采用我们在application中配置的option,在display的时候不传入option,采用的就是application中配置的默认样式。
ImageLoader.getInstance().displayImage(url, this);
public class MainActivity extends AppCompatActivity {
private ImageView imageView1, imageView2, imageView3;
private ImageLoader mImageLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageLoader = ImageLoader.getInstance(); //这一步操作最好放在基类里
imageView1 = (ImageView) findViewById(R.id.imageview1);
imageView2 = (ImageView) findViewById(R.id.imageview2);
imageView3 = (ImageView) findViewById(R.id.imageview3);
//ImageLoaderConfiguration已在application中配置好,要展示不同样式的图片只需设置不同的option即可
//其他参数我不设置了,为了演示代码我只设置展示图片的圆角样式
DisplayImageOptions options1 = new DisplayImageOptions.Builder()
.displayer(new RoundedBitmapDisplayer(0))
.build();
mImageLoader.displayImage("url_1", imageView1, options1);
DisplayImageOptions options2 = new DisplayImageOptions.Builder()
.displayer(new RoundedBitmapDisplayer(30))
.build();
mImageLoader.displayImage("url_2", imageView2, options2);
DisplayImageOptions options3 = new DisplayImageOptions.Builder()
.displayer(new RoundedBitmapDisplayer(360))
.build();
mImageLoader.displayImage("url_2", imageView3, options3);
}
}
最后我简单封装了一个图片请求的工具类,支持对图片的二次采样大小,以及显示样式,是否启用缓存等操作,供大家参考。
package com.zhuandian.msuic;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
/**
* Created by 谢栋 on 2016/12/25.
*/
public class UniversalImageLoader {
/**
* 通过传入的url下载图片并显示在ImageVIew上
*
* @param context 上下文
* @param url 请求图片的url
* @param imageView 要显示图片的ImageView控件
*/
public static void getImage(Context context, String url, ImageView imageView) {
//1.简单得到一张未处理的图片,使用默认的ImageLoaderConfiguration
// ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));
// ImageLoader.getInstance().displayImage(url,imageView);
//2.使用自定义配置的ImageLoaderConfiguration修改图片的显示样式,启用缓存等...
//设置图片展示的配置,是否qiy启用缓存,图片显示的样式(圆角,方角)
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true) //启用二级缓存 (检测内存中是否有改图片存在)
.cacheOnDisk(true) //启用磁盘缓存 (检测磁盘中是否有改图片存在)
.displayer(new RoundedBitmapDisplayer(50)) //设置展示的样式
.build();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
// .memoryCacheSize(5*1024*1024) //设置二级缓存(内存缓存)的指定大小
.memoryCacheSizePercentage(20) //设置内存缓存占有的百分比
.diskCacheFileCount(80) //设置允许缓存的图片数量,当大于指定数量时会删除一部分
.diskCacheSize(5 * 1024 * 1024) //设置磁盘缓存的大小
// .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) //设置图片展示的模式(默认不做任何处理)
.defaultDisplayImageOptions(options)
.build();
ImageLoader.getInstance().init(configuration); //传入自定义的ImageLoaderConfiguration
ImageLoader.getInstance().displayImage(url, imageView);
ImageLoader.getInstance().displayImage(url, imageView, options, new ImageLoadingListener() {
// 设置监听事件
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
}, new ImageLoadingProgressListener() {
//监听进度比
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
}
});
}
}
其实Universal-Image-Loader还是比较强大的,主要支持的功能有一下几个方面
- 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
- 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
- 支持图片的内存缓存,文件系统缓存或者SD卡缓存
- 支持图片下载过程的监听
- 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
- 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
- 提供在较慢的网络下对图片进行加载
当然我贴上的代码只是简单的用法之一,大家在实际项目开发中可以根据需求自己来定制相应的功能,其他一些用法跟具体细节还是需要大家自己动手去尝试下