对框架的使用。最好进行二次封装。解耦
这篇文章希望通过图片缓存框架希望能发现,对框架再次封装使用的要点。
1.首先创建一个框架工具类,或者帮助类
2.初始化所需要的对象。
/***
* 初始化一个正常的ImageLoader
* @param context
*/
public static void init (Context context){
ImageLoaderConfiguration.Builder config =new ImageLoaderConfiguration.Builder(context);
config.threadPriority(Thread.NORM_PRIORITY - 2);
config.denyCacheImageMultipleSizesInMemory();
//md5加密
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
config.diskCacheSize(80 * 1024 * 1024); // 80 MiB
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // Remove for release app
ImageLoader.getInstance().init(config.build());
}
3.在工具类对象生成时,初始化几种常见的配置,并将配置的方法进行抽取
/**
* 标准配置
*/
private DisplayImageOptions normalOptions;
/**
* 圆形配置
*/
private DisplayImageOptions circleOptions;
/**
* 圆角图片配置
*/
private DisplayImageOptions roundedOptions;
private BitmapDisplayer simpleBitmapDisplayer;
private BitmapDisplayer circleBitmapDisplayer;
private BitmapDisplayer roundedBitmapDisplayer;
public ImageLoaderHelper() {
//初始化 全局默认图片
simpleBitmapDisplayer = new SimpleBitmapDisplayer();
normalOptions = getOption(simpleBitmapDisplayer);
circleBitmapDisplayer = new CircleBitmapDisplayer();
circleOptions = getOption(circleBitmapDisplayer);
//圆角图片 圆角半径dp
int cornerRadiusDp = 10;
//圆角大小通过 dp2px转换 使得 不同分辨率设备上呈现一致显示效果
roundedBitmapDisplayer = new RoundedBitmapDisplayer(dip2px(MyApplication.getContext(),cornerRadiusDp));
roundedOptions = getOption( roundedBitmapDisplayer);
}
private int dip2px(Context context, float dpValue) {
final float density = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * density + 0.5f);
}
/**
* 重构 抽取出的通用生成Option方法
* @param bitmapDisplayer normal 或圆形、圆角 bitmapDisplayer
*
* @return
*/
private DisplayImageOptions getOption( BitmapDisplayer bitmapDisplayer) {
return new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(bitmapDisplayer)
.build();
}
4.通过不同的方法完成不同的工具类操作
/**
* 正常加载一个图片
*/
public void loadImageView(ImageView iv, String url) {
ImageLoader.getInstance().displayImage(url, iv, normalOptions);
}
/***
* 圆角加载
* @param iv
* @param url
*/
public void loadCircleImageView(ImageView iv, String url) {
ImageLoader.getInstance().displayImage(url, iv, circleOptions);
}
public void loadRoundedImageView(ImageView iv, String url) {
ImageLoader.getInstance().displayImage(url, iv, roundedOptions);
}
这里写一些Universal-image-loader的常用配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(context)
.memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽
.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)/设置缓存的详细信息,最好不要设置这个
.threadPoolSize(3)//线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100) //缓存的文件数量
.discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
.writeDebugLogs() // Remove for release app
.build();//开始构建
// Initialize ImageLoader with configuration.
包括几大部分可以自定义,磁盘信息,内存信息,图片信息等。
展示的配置:
DisplayImageOptions options;
options = new DisplayImageOptions.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.Options decodingOptions)//设置图片的解码配置
//.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间
//设置图片加入缓存前,对bitmap进行设置
//.preProcessor(BitmapProcessor preProcessor)
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
.displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
.build();//构建完成
部分API过时 disc 变成disk.
display 有四种重载方式,可以进一步监听加载进度等。