在经过几年的经验累积之后,我终于决定整理一下曾经遇到的各种问题,给各位走在Android开发路上的朋友一点帮助,更多相关问题,请访问我的博客:http://blog.csdn.net/xiaoliluote 如果您对该问题有更多的解决方式,请留言,验证之后我会编辑博客
ImageLoader是当前加载图片非常好用的一个第三方框架,下面我来介绍一下在实际操作过程中非常常用的几个逻辑。
1.将图片切成圆角、圆形
DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) //设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.icon_empty) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.icon_error) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
.displayer(new RoundedBitmapDisplayer(90)) // 设置成圆角、圆形图片,我这里将new RoundedBitmapDisplayer的参数设置为90,就是圆形图片,其他角度可以根据需求自行修改
.build(); // 创建配置过得DisplayImageOption对象
2.加载本地drawable的图片
//这里先假设你已经初始化过ImageLoader了
ImageView test =(ImageView)findViewById(R.id.test);
ImageLoader loader = ImageLoader.getInstance();
loader.displayImage("drawable://"+R.drawable.ic_launcher,test); //第一个参数写 drawable:// 再加上图片的id,
//就可以显示本地drawable图片了,但是ImageLoader框架在
//这里有一个BUG,请查看第三点
//显示图片的这个方法,还支持传入设置参数的,因为一般我们在初始化
//ImageLoader的时候,做的设定不会对图片进行圆角裁剪,
//毕竟不是所有图片都要做圆角嘛,就像下面这个设定一样
if (!ImageLoader.getInstance().isInited()) {
// 初始化ImageLoader
@SuppressWarnings("deprecation")
DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.icon_empty) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.icon_error) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
.build(); // 创建配置过得DisplayImageOption对象
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()).defaultDisplayImageOptions(options)
.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).build();
ImageLoader.getInstance().init(config);
}
//上面是一个比较常见的ImageLoader初始化的参数设定,
//是没有对图片进行圆角裁剪的,但现在我们有的图片
//需要进行圆角裁剪,怎么办呢?又不能再次初始化参数,
//这也不合理,于是我们可以在displayImage方法里面通过
//参数来对需要圆角裁剪的ImageView进行单独的参数设定,就像下面这样:
DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.icon_empty) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.icon_error) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
.displayer(new RoundedBitmapDisplayer(90)) // 设置成圆角图片
.build(); // 创建配置过得DisplayImageOption对象
ImageLoader loader = ImageLoader.getInstance();
loader.displayImage("drawable://"+R.drawable.ic_launcher,test,options); //在这里再多传入一个参数 options,
//就可以单独使用不同的设定啦
3.使用ImageLoader加载本地drawable图片的一个坑
//就像我第二点所说的常用的ImageLoader的初始化设定一样,
//大多数人都会加上 .cacheInMemory(true) 和.cacheOnDisc(true)
//这两个设定,从而给图片做缓存处理,提高程序的相应效率,
//这是无可厚非的,但是在加载本地drawable的时候,
//请记得一定要重新设定DisplayImageOptions,并将.cacheInMemory(true)
//和.cacheOnDisc(true) 改为 .cacheInMemory(false) 和.cacheOnDisc(false),
//否则的话,当你有多个地方使用ImageLoader来
//加载drawable的时候,你就会发现显示出来的图片,
//和你代码写的居然不一样!!!
//这与ImageLoader的缓存机制有关,将图片ID从R文件
//读取出来之后,ImageLoader又自己做了一个ID处理,
//当使用多个drawable的时候,会有ID重叠了,
//就导致了可能部分加载的图片和你代码设定的不一致,
//这个BUG我提交过到ImageLoader的github上,
//但似乎并没有人处理,官方甚至打算忽略这个BUG,
//并提示用户:不建议使用ImageLoader来加载本地drawable
//如果你已经使用ImageLoader来加载drawable,
//并且已经出现了上述问题,才来观看我的博客的话,
//可能会出现你即使更改了代码,但运行效果依然
//没有变化的结果哦,这是因为之前已经有过缓存到APP了,
//解决办法有两个:
1.不要直接运行覆盖APP,先把已经安装的卸载掉(要清空数据缓存哦)
2.在代码准备加载图片前,清空ImageLoader的缓存
loader.clearDiscCache();
loader.clearMemoryCache();