UIL的使用
Android-Universal-Image-Loader(UIL)是最常用的几个开源库之一。UIL(Universal-Image-Loader)旨在提供一个强大的、灵活的和高度可定制的工具图像加载、缓存和显示功能。并且提供了许多配置选项和良好控制图像加载和缓存的过程。
项目地址:
https://github.com/nostra13/Android-Universal-Image-Loader
基本使用方法:
引入jar包
采用Android Studio开发项目了,我们只需要build.gradle中添加以下依赖即可:compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
由于是使用过程中会图片获取要通过网络,并且有缓存设置,所以这2个权限必须要有。
1. <uses-permission android:name="android.permission.INTERNET" />
2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在Application中初始化
public classUILApplicationextendsApplication {
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressWarnings("unused")
@Override
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
}
public static void initImageLoader(Context context) {
/*
* configuration表示ImageLoader的全局配置信息,创建ImageLoader时使用
* 可包括图片最大尺寸,线程池,缓存,下载器,解码器等等。
* 这里可以根据需要自行配置,修改慎重!
* */
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480,800)/*解析图片时候使用的最大尺寸,默认为屏幕设备宽高*/
.diskCacheExtraOptions(480,800, null)/*从网络下载图片后保存到磁盘时使用的图片尺寸及压缩方法,如果不设置则保存原始图片*/
.threadPoolSize(3)/*线程池的大小,默认值为3,注意不要设置的过大,过大之后会有OOM问题*/
.threadPriority(Thread.NORM_PRIORITY- 1)/*设置线程的优先级别:5-1*/
/*
* tasksProcessingOrder:设置图片加载和显示队列处理的类型默认为QueueProcessingType.
FIFO注:如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效
*/
.tasksProcessingOrder(QueueProcessingType.FIFO)
.memoryCache(new LruMemoryCache(2* 1024 * 1024))/*设置内存缓存 默认为一个当前应用可用内存的1/8大小的LruMemoryCache*/
.memoryCacheSize(2* 1024 * 1014)/*设置内存缓存的最大大小 默认为一个当前应用可用内存的1/8 */
.memoryCacheSizePercentage(13)/*设置内存缓存最大大小占当前应用可用内存的百分比默认为一个当前应用可用内存的1/8*/
.diskCache(newUnlimitedDiskCache(StorageUtils.getCacheDirectory(context)))/*默认为StorageUtils.getCacheDirectory(getApplicationContext()),即/mnt/sdcard/android/data/包名/cache/*/
.diskCacheSize(50* 1024 * 1024)/*设置硬盘缓存的最大大小*/
.diskCacheFileCount(100)/*设置硬盘缓存的文件的最多个数*/
.diskCacheFileNameGenerator(newHashCodeFileNameGenerator())/*设置硬盘缓存文件名生成规范*/
.imageDownloader(newBaseImageDownloader(context))/*设置图片下载器*/
.imageDecoder(DefaultConfigurationFactory.createImageDecoder(false))/*设置图片解码器*/
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())/*设置默认的图片显示选项*/
.denyCacheImageMultipleSizesInMemory()/*不缓存图片的多种尺寸在内存中*/
.writeDebugLogs()/*打印调试Log,注意上线之前要去掉这句话*/
.imageDownloader(/*图片下载器的设置*/
new BaseImageDownloader(context,5 * 1000, 30* 100)/*(connectTimeout,readTimeout)超时时间*/
)
.build();
ImageLoader.getInstance().init(configuration);/*使用基本配置信息初始化ImageLoader*/
}
}
注:通常一个应用程序只需要对ImageLoader进行一次初始化,当用户想修改ImageLoader的配置时,重新条用init函数并不会有效果(这个后面会在源码中分析),必须将原来的ImageLoader销毁,初始化新的ImageLoader。
图片加载:
使用ImageLoader进行图片加载的时候,先要实例化ImageLoader,调用以下方法进行实例化,在每个布局里面都要实例化后再使用。
1. protected ImageLoader imageLoader = ImageLoader.getInstance();
Ø 加载默认配置的图片
ImageLoader.getInstance().displayImage(imageUrl, imageView);
// imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件
当然UIL不仅可以加载网络图片,还可以加载本地图片,以下是几种不同来源的图片的url地址示例:
String imageUri ="http://site.com/image.png";//from Web
String imageUri ="file:///mnt/sdcard/image.png";//from SD card
String imageUri ="content://media/external/audio/albumart/13";//from content provider
String imageUri ="assets://image.png";// fromassets
String imageUri ="drawable://" + R.drawable.image;// fromdrawables (only images, non-9patch)
Ø 加载自定义配置的图片
进行显示的图片的各种格式DisplayImageOptions 的设置:
DisplayImageOptionsoptions;
options = newDisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)//设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_launcher) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)//设置下载的图片是否缓存在内存中
.cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
.decodingOptions(android.graphics.BitmapFactory.OptionsdecodingOptions)//设置图片的解码配置
//.delayBeforeLoading(intdelayInMillis)//int delayInMillis为你设置的下载前的延迟时间
//设置图片加入缓存前,对bitmap进行设置
//.preProcessor(BitmapProcessorpreProcessor)
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.displayer(newRoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
.displayer(newFadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
.build();//构建完成
加载图片:
ImageLoader.getInstance().displayImage(imageUrl, imageView,options);
// imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件
Ø 图片加载时带加载监听
imageLoade.displayImage(imageUrl, imageView,options, newImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri,View view) {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(String imageUri,View view, FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(StringimageUri,View view, BitmaploadedImage) {
//加载成功的时候执行
}
@Override public void onLoadingCancelled(String imageUri, View view){ //加载取消的时候执行 } }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { //在这里更新 ProgressBar的进度信息 } });
Ø 通多loadImage加载图片
除了通过displayImage,加载并自动显示图片,还可以通过loadImage下载图片,再手动加载到imageView上。
imgDemoPic=(ImageView)findViewById(R.id.imgDemoPic);//imageView用来显示图片
ImageSizemImageSize=newImageSize(100,100);
ImageLoader.getInstance().loadImage(imageUrl,mImageSize,newSimpleImageLoadingListener(){
@Override
public void onLoadingComplete(StringimageUri,View view, BitmaploadedImage) {
super.onLoadingComplete(imageUri,view, loadedImage);
imgDemoPic.setImageBitmap(loadedImage);//显示在imageView上面
}
});