使用ImageLoader显示圆角图片、圆形图片、加载drawable的BUG

在经过几年的经验累积之后,我终于决定整理一下曾经遇到的各种问题,给各位走在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();
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值