Glide-指定占位图、图片格式、图片大小(二)

占位图

观察刚才加载网络图片的效果,你会发现,要稍微等一会图片才会显示出来。这其实很容易理解,因为从网络上下载图片本来就是需要时间的。那么我们有没有办法再优化一下用户体验呢?当然可以,Glide提供了各种各样非常丰富的API支持,其中就包括了占位图功能

首先准备一张loading.png图片作为占位图

Glide.with(this)
     .load(url)
     .placeholder(R.mipmap.loading)
     .into(imageView);

对比之前的三个方法,只是插入了一个placeholder()方法,然后将占位图片的资源id传入到这个方法中即可

第一次加载网络图片,比较慢,效果如下

这里写图片描述

不过如果你现在重新运行一下代码,很可能是根本看不到占位图效果。因为Glide有非常强大的缓存机制,我们刚才加载那张图片的时候Glide自动就已经将它缓存下来了,下次加载的时候将会直接从缓存中读取,不会再去网络下载了,因而加载的速度非常快,所以占位图可能根本来不及显示

因此这里我们还需要稍微做一点修改,来让占位图能有机会显示出来,修改代码如下:

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

可以看到,这里串接了一个diskCacheStrategy()方法,并传入DiskCacheStrategy.NONE参数,这样就可以禁用掉Glide的缓存功能

效果图就不贴了,和上面的gif差不多,运行程序,会立即显示一张占位图,然后等真正的图片加载完成之后会将占位图替换掉

当然,这只是占位图的一种,除了这种加载占位图之外,还有一种异常占位图。异常占位图就是指,如果因为某些异常情况导致图片加载失败,比如说手机网络信号不好,这个时候就显示这张异常占位图

还是先准备一张error.png当作异常占位图

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.mipmap.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

这里又串接了一个error()方法就可以指定异常占位图了

现在你可以将图片的url地址修改成一个不存在的图片地址,或者直接将手机的网络关掉,然后重新运行程序,效果如下图:

这里写图片描述

指定图片格式

Glide另外一个强大的功能,那就是Glide是支持加载GIF图片的。相比现在我们项目中用到的ImageLoader就不支持GIF

使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式,我们只需要将刚才那段加载图片代码中的URL地址替换成一张GIF图片的地址就可以了,现在重新运行一下代码,效果如下图所示:

这里写图片描述

不管我们传入的是一张普通图片,还是一张GIF图片,Glide都会自动进行判断,并且可以正确地把它解析并展示出来。是不是很强大?!o( ̄▽ ̄)ブ

但是如果想指定图片的格式该怎么办?比如说,希望加载的这张图必须是一张静态图片,我不需要Glide自动帮我判断它到底是静图还是GIF图

想实现这个功能仍然非常简单,我们只需要再串接一个新的方法就可以了

Glide.with(this)
     .load(url)
     .asBitmap()
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

可以看到,这里在load()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了

现在重新运行一下程序,效果如下图:

这里写图片描述

因为调用了asBitmap()方法,现在GIF图就无法正常播放了,而是会在界面上显示第一帧的图片

如果我们想要实现必须加载动态图片的功能,就可以这样写

Glide.with(this)
     .load(url)
     .asGif()
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

那么既然指定了只允许加载动态图片,如果我们传入了一张静态图片的URL地址又会怎么样呢?将图片的URL地址改成刚才静态图,然后重新运行代码,效果如下图:

这里写图片描述

如果指定了只能加载动态图片,而传入的图片却是一张静图,那么结果自然就只有加载失败

指定图片大小

实际上,使用Glide在绝大多数情况下我们都是不需要指定图片大小的

我们平时在加载图片的时候很容易会造成内存浪费。什么叫内存浪费呢?比如说一张图片的尺寸是1000*1000像素,但是我们界面上的ImageView可能只有200*200像素,这个时候如果你不对图片进行任何压缩就直接读取到内存中,这就属于内存浪费了,因为程序中根本就用不到这么高像素的图片

而使用Glide,我们就完全不用担心图片内存浪费,甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少。Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支

不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。修改Glide加载部分的代码,如下所示:

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .override(100, 100)
     .into(imageView);

这里使用override()方法指定了一个图片的尺寸,也就是说,Glide现在只会将图片加载成100*100像素的尺寸,而不会管你的ImageView的大小是多少了


关于Glide这些文章,大部分我只是搬运工,然后加上了自己掉过的坑,供小白参考。
感谢郭大侠写出了这么简单明了的博客,φ(゜▽゜*)♪
下面是郭大侠的原博文地址

http://blog.csdn.net/guolin_blog/article/details/53759439

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值