Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。
(1).使用多线程加载图片
(2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等;
(3).图片异步加载缓存机制,包括内存缓存及SDCard缓存;
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。
常用的功能,网上都有了,现在讲一下,加载后手工
(1)圆角化等处理
/**
* 加载图片
*
* @param uri
* @param imageView
* @param options
* @param spinner 进度条,可以要可以不要
* @param imageLoadingListener 图片加载监听器
* @param needRoundImage 图片是否圆角化
*
*/
public void display(String uri , ImageView imageView , DisplayImageOptions options , final ProgressBar spinner , ImageLoadingListener imageLoadingListener , final boolean needRoundImage){
try {
if(options == null){
options = new DisplayImageOptions.Builder()
// .showStubImage(R.drawable.default_photo_small)
// .showImageForEmptyUri(R.drawable.default_photo_small)
// .showImageOnFail(R.drawable.default_photo_small)
.resetViewBeforeLoading(true)
.cacheOnDisc(true)
.imageScaleType(ImageScaleType.EXACTLY)
// .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.bitmapConfig(Bitmap.Config.RGB_565)
// .displayer(new FadeInBitmapDisplayer(300))
.build();
}
if(imageLoadingListener == null){
imageLoadingListener = new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
if(spinner != null){
spinner.setVisibility(View.VISIBLE);
}
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
CLog.e(TAG, imageUri+"/t加载失败!");
if(spinner != null){
spinner.setVisibility(View.GONE);
}
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
/**
* 圆角化处理
*/
if(needRoundImage){
((ImageView) view).setImageBitmap(toRoundBitmap(loadedImage));
}
if(spinner != null){
CLog.d(TAG, imageUri+"/t加载成功!" );
spinner.setVisibility(View.GONE);
}
}
};
}
imageLoader.displayImage(uri, imageView , options , imageLoadingListener);
} catch (Exception e) {
CLog.e(TAG , "exception!" , e);
}
}
/**
* 转换图片成圆形
* @param bitmap
* 传入Bitmap对象
* @return
*/
public Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
left = 0;
top = 0;
right = width;
bottom = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);// 设置画笔无锯齿
canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas
paint.setColor(color);
// 以下有两种方法画圆,drawRounRect和drawCircle
// canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
canvas.drawCircle(roundPx, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://trylovecatch.iteye.com/blog/1189452
canvas.drawBitmap(bitmap, src, dst, paint); //以Mode.SRC_IN模式合并bitmap和已经draw了的Circle
return output;
}
(2)手工从缓存中取出bitmap
/**
* 使用此加载框架的imageloader加载的图片,设置了缓存后,下次使用,手工从缓存取出来用,这时特别要注意,不能直接使用:
* imageLoader.getMemoryCache().get(uri)来获取,因为在加载过程中,key是经过运算的,而不单单是uri,而是:
* String memoryCacheKey = MemoryCacheUtil.generateKey(uri, targetSize);
*
* @return
*/
public Bitmap getBitmapFromCache(String uri){//这里的uri一般就是图片网址
List<String> memCacheKeyNameList = MemoryCacheUtil.findCacheKeysForImageUri(uri , imageLoader.getMemoryCache());
if(memCacheKeyNameList != null && memCacheKeyNameList.size() > 0){
CLog.d(TAG , "memCache size ============> " + memCacheKeyNameList.size());
for(String each:memCacheKeyNameList){
CLog.d(TAG , "memCache each ============> " + each);
}
return imageLoader.getMemoryCache().get(memCacheKeyNameList.get(0));
}
return null;
}
取出的key有可能有两个,如:
http://tizi-zujuan-thumb.oss.aliyuncs.com/qfactory_word_img/201405/ae/309e9b359d0541f87e40f0d8eCKS74F.gif
http://tizi-zujuan-thumb.oss.aliyuncs.com/qfactory_word_img/201405/ae/309e9b359d0541f87e40f0d8eCKS74F.gif_720x1280
(3)加载图片(没有imageview控件,只想加载图片的bitmap到内存中)
/**
* 加载图片
* @param uri
* @param listener
*/
public void loadImage(String uri , ImageLoadingListener listener){
// imageLoader.loadImage(uri, listener);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_photo_small)
.showImageForEmptyUri(R.drawable.default_photo_small)
.showImageOnFail(R.drawable.default_photo_small)
// .resetViewBeforeLoading(true)
.cacheOnDisc(true)
.cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
// .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
// .bitmapConfig(Bitmap.Config.RGB_565)
// .displayer(new FadeInBitmapDisplayer(300))
.resetViewBeforeLoading(true)
.build();
imageLoader.loadImage(uri, options, listener);
}
加载使用示例:
/**
* 网络加载图片
* 这里需要注意的是,一个问题界面,会有多张如公式等小图,他们在加载过程中,都会到方法onLoadingStarted,但如果图多同时加载,后面几张图就可以加载不出来,
* 会进入onLoadingCancelled方法,所以这里在onLoadingCancelled方法里再调用typesetDelegate.refresh();方法刷新一下图,
* 图应该是下载下来了,只是不知道为什么到了onLoadingCancelled方法。
*/
UniversalImageLoaderUtil.getInstance().loadImage(getBitmapUrl().trim(), new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
CLog.d(TAG , "onLoadingStarted ===>" + imageUri);
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
CLog.e(TAG , "onLoadingFailed ===>" + imageUri);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if(null == loadedImage){
return;
}
boolean bool = (Math.abs(loadedImage.getWidth()
- TiKuBitmapSpan.this.getPresetWidth()) > TYPESET_THRESHOLD)
|| (Math.abs(loadedImage.getHeight()
- TiKuBitmapSpan.this.getPresetHeight()) > TYPESET_THRESHOLD);
/**
* 调用refresh方法,刷新控件界面,那么又会重走该render方法,这里图片已在缓存,所以就不会再去网络加载,不会再走回这里造成死循环,一直刷新
*/
typesetDelegate.refresh(bool);
CLog.d(TAG , "onLoadingComplete bool===>" + bool);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
/**
* 调用refresh方法,刷新控件界面,那么又会重走该render方法,这里图片已在缓存,所以就不会再去网络加载,不会再走回这里造成死循环,一直刷新
*/
typesetDelegate.refresh(true);
CLog.e(TAG , "onLoadingCancelled ===>" + imageUri);
}
});
这里特别要注意的是,同时加载多个url的bitmap,有可能会因超时等原因(具体我也不知道什么的原因),最后跳到监听器的onLoadingCancelled方法(此时图片也可能在后台加载了),所以对种特殊情况也要处理。
完整的工具类代码:
package com.yiduoyun.tiku.util;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
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.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.MemoryCacheUtil;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.yiduoyun.tiku.R;
/**
* 使用开源图片加载框架Universal-Image-Loader
*
* @author chenwenbiao
* @date 2013-11-1 上午11:21:45
* @version V1.0
*/
public class UniversalImageLoaderUtil {
private static String TAG = UniversalImageLoaderUtil.class.getName();
private static UniversalImageLoaderUtil universalImageLoaderUtil = null;
private static ImageLoader imageLoader = null;
private static DisplayImageOptions options = null;
// private static ProgressBar spinner = null;
/**
* 返回图片加载工具类实例
* @return
*/
public static UniversalImageLoaderUtil getInstance() {
if (universalImageLoaderUtil == null) {
synchronized (UniversalImageLoaderUtil.class) {
if (universalImageLoaderUtil == null) {
universalImageLoaderUtil = new UniversalImageLoaderUtil();
}
}
}
return universalImageLoaderUtil;
}
/**
* 记得使用前初始化context
* @param aContext
*/
public void setContext(Context aContext) {
imageLoader = ImageLoader.getInstance();
// imageLoader.init(ImageLoaderConfiguration.createDefault(aContext));
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(aContext.getApplicationContext())
.memoryCache(new LruMemoryCache(16 * 1024 * 1024))
// .memoryCacheSize(16 * 1024 * 1024)
.discCacheSize(100 * 1024 * 1024)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
// .discCacheFileCount(100)
// .writeDebugLogs()
.threadPoolSize(10)
.build();
/*File cacheDir = StorageUtils.getCacheDirectory(aContext);
CLog.d(TAG , "cache direction =======> " + cacheDir);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(aContext)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
// .taskExecutor(null)
// .taskExecutorForCachedImages(null)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.discCache(new UnlimitedDiscCache(cacheDir)) // default
.discCacheSize(50 * 1024 * 1024)
.discCacheFileCount(100)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(aContext)) // default
// .imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();*/
/*File cacheDir = StorageUtils.getCacheDirectory(aContext);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(aContext)
//如果图片尺寸大于了这个参数,那么就会这按照这个参数对图片大小进行限制并缓存
.memoryCacheExtraOptions(480, 800) // default=device screen dimensions
.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75 , null)
// .memoryCacheExtraOptions(40, 80) // default=device screen dimensions
// .discCacheExtraOptions(40, 80, CompressFormat.JPEG, 75 , null)
// .taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
// .taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.discCache(new UnlimitedDiscCache(cacheDir)) // default
.discCacheSize(50 * 1024 * 1024)
.discCacheFileCount(100)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(aContext)) // default
.imageDecoder(new BaseImageDecoder(false)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
// .enableLogging()
.build();
*/
try {
imageLoader.init(config);
} catch (Exception e) {
CLog.e(TAG , "exception" , e);
}
}
/**
* 获取图片加载器实例
* @return
*/
public static ImageLoader getImageLoader(){
return imageLoader;
}
/**
* 加载图片
*
* @param uri
* @param imageView
* @param options
* @param spinner 进度条,可以要可以不要
* @param imageLoadingListener 图片加载监听器
* @param needRoundImage 图片是否圆角化
*
*/
public void display(String uri , ImageView imageView , DisplayImageOptions options , final ProgressBar spinner , ImageLoadingListener imageLoadingListener , final boolean needRoundImage){
try {
if(options == null){
options = new DisplayImageOptions.Builder()
// .showStubImage(R.drawable.default_photo_small)
// .showImageForEmptyUri(R.drawable.default_photo_small)
// .showImageOnFail(R.drawable.default_photo_small)
.resetViewBeforeLoading(true)
.cacheOnDisc(true)
.imageScaleType(ImageScaleType.EXACTLY)
// .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.bitmapConfig(Bitmap.Config.RGB_565)
// .displayer(new FadeInBitmapDisplayer(300))
.build();
}
if(imageLoadingListener == null){
imageLoadingListener = new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
if(spinner != null){
spinner.setVisibility(View.VISIBLE);
}
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
CLog.e(TAG, imageUri+"/t加载失败!");
if(spinner != null){
spinner.setVisibility(View.GONE);
}
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
/**
* 圆角化处理
*/
if(needRoundImage){
((ImageView) view).setImageBitmap(toRoundBitmap(loadedImage));
}
if(spinner != null){
CLog.d(TAG, imageUri+"/t加载成功!" );
spinner.setVisibility(View.GONE);
}
}
};
}
imageLoader.displayImage(uri, imageView , options , imageLoadingListener);
} catch (Exception e) {
CLog.e(TAG , "exception!" , e);
}
}
public void display(String uri , ImageView imageView , DisplayImageOptions options , final ProgressBar spinner , final boolean needRoundImage){
display(uri, imageView, options, spinner, null , needRoundImage);
}
/**
* 加载图片,并将图片圆角化
*
* @param uri
* @param imageView
* @param roundPixels
*/
public void display(String uri , ImageView imageView , int roundPixels){
try {
if(roundPixels < 1){
roundPixels = 10000;//搞个巨大的数据,让它变圆
}
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_photo_big)
.showImageForEmptyUri(R.drawable.default_photo_big)
.showImageOnFail(R.drawable.default_photo_big)
.resetViewBeforeLoading(true)
.cacheOnDisc(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.displayer(new RoundedBitmapDisplayer(roundPixels))
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
imageLoader.displayImage(uri, imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
CLog.e(TAG, "load image error! message:" + message);
}
});
} catch (Exception e) {
CLog.e(TAG , "exception!" , e);
}
}
/**
* 转换图片成圆形
* @param bitmap
* 传入Bitmap对象
* @return
*/
public Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
left = 0;
top = 0;
right = width;
bottom = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);// 设置画笔无锯齿
canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas
paint.setColor(color);
// 以下有两种方法画圆,drawRounRect和drawCircle
// canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
canvas.drawCircle(roundPx, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://trylovecatch.iteye.com/blog/1189452
canvas.drawBitmap(bitmap, src, dst, paint); //以Mode.SRC_IN模式合并bitmap和已经draw了的Circle
return output;
}
/**
* 使用此加载框架的imageloader加载的图片,设置了缓存后,下次使用,手工从缓存取出来用,这时特别要注意,不能直接使用:
* imageLoader.getMemoryCache().get(uri)来获取,因为在加载过程中,key是经过运算的,而不单单是uri,而是:
* String memoryCacheKey = MemoryCacheUtil.generateKey(uri, targetSize);
*
* @return
*/
public Bitmap getBitmapFromCache(String uri){//这里的uri一般就是图片网址
List<String> memCacheKeyNameList = MemoryCacheUtil.findCacheKeysForImageUri(uri , imageLoader.getMemoryCache());
if(memCacheKeyNameList != null && memCacheKeyNameList.size() > 0){
CLog.d(TAG , "memCache size ============> " + memCacheKeyNameList.size());
for(String each:memCacheKeyNameList){
CLog.d(TAG , "memCache each ============> " + each);
}
return imageLoader.getMemoryCache().get(memCacheKeyNameList.get(0));
}
return null;
}
/**
* @Title: getLocalBitmapFromCache
* @Description: 这个方法只适用于加载本地图片的情况(考虑到计算key的过程),这里的key使用的是文本,注意添加内存缓存和获取Bitmap缓存的key一定要一致
* @author gaoshunsheng
* @param @param uri
* @return Bitmap
* @throws
*/
// public Bitmap getLocalBitmapFromCache(String text)
// {
// return imageLoader.getMemoryCache().get(text);
// }
//
// /**
// * @Title: addBitmap2Memorycache
// * @Description: 添加Bitmap对象到缓存中,这里一般用于本地资源图片,key为文本
// * @author gaoshunsheng
// * @param @param text
// * @param @param value
// * @return void
// * @throws
// */
// public void addBitmap2Memorycache(String text, Bitmap value)
// {
// imageLoader.getMemoryCache().put(text, value);
// }
//
// /**
// * @Title: loadImageAsync
// * @Description: 异步加载图片,不显示在某个View上
// * @author gaoshunsheng
// * @param @param uri
// * @param @param listener
// * @return void
// * @throws
// */
// public void loadImageAsync(String uri, ImageLoadingListener listener)
// {
// imageLoader.loadImage(uri, listener);
// }
/**
* 清除缓存
*/
public void clearCache(){
if(imageLoader != null){
try {
imageLoader.clearMemoryCache();
imageLoader.clearDiscCache();
} catch (Exception e) {
CLog.e(TAG , "exception" , e);
}
}
}
/**
* 加载图片
* @param uri
* @param listener
*/
public void loadImage(String uri , ImageLoadingListener listener){
// imageLoader.loadImage(uri, listener);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_photo_small)
.showImageForEmptyUri(R.drawable.default_photo_small)
.showImageOnFail(R.drawable.default_photo_small)
// .resetViewBeforeLoading(true)
.cacheOnDisc(true)
.cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
// .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
// .bitmapConfig(Bitmap.Config.RGB_565)
// .displayer(new FadeInBitmapDisplayer(300))
.resetViewBeforeLoading(true)
.build();
imageLoader.loadImage(uri, options, listener);
}
}
记得在Application类里加上初始化代码:
UniversalImageLoaderUtil.getInstance().setContext(this);