最近应用经常出现OOM的问题,于是图片加载的方式由原来的ImageLoader变成了Glide。我也是跟着导师慢慢的学习了解,有不对的地方欢迎指正。
首先,我发现Glide的一个限制性,也就是Glide只能用于ImageView,这是一个不好的地方,但是除了这个基本上都是好用的。
Glide加载图片最简单的方式如下:
Glide.with(Activity/Context/Fragment/FragmentActivity).load().into(ImageView实例);
从上面这张图可以看到Glide可以通过with()方法来获得Activity/Fragment作为参数,为什么要用Activity/Fragment,这里就涉及到一个生命周期的问题,不过我更喜欢使用getApplicationContext,这样Glide图片加载的生命周期就与Application保持一致,可以避免当用户进入一个界面,图片还没Glide加载出来时,用户快速退出,可以导致的异常情况。也就是说此时的Glide图片加载不仅仅是与当前所在的Activity/Fragment同在,而是和当前的这个应用同在。当然了,有可能我们是要在适配器中使用Glide,那就没有办法,只能使用Context了。
从上图可以看出,Glide图片加载有很多中获取图片的方式,包括文件获取、资源文件Id获取、Uri等等。
确定了加载的图片,当然是要把图片放进对应的控件里面,也就是调用into()方法,在括号里面放入我们的控件即可。
除了上面这些,Glide的加载中还可能用到下面的方法。
1.第一个方法很让我惊讶的就是Glide能加载Gif动图,在Glide中有asBitmap()和asGif()。很明显前者是要求像图片一样展示,后者则是像Gif动图一样展示,当我们加载的是一个gif动图,并且调用asGif()方法,就能实现动图的展示了。突然好像明白微信聊天的动图是怎么来的了,很有可能就是Glide.with().load().asGif().into()这样一行代码实现的呢!
2.Glide有淡入淡出的效果,因为它有
crossFade()
crossFade(intanimationId, int duration)
crossfade(intduration)
这三个方法,其中animationId就是动画对应的Id,duration则是持续的时间。
3.在开发的过程中,我遇到一个问题,就是界面出现了类似油状物的部分,后面得知Glide加载时有动画效果,也就是Glide中下面这行代码:
只要调用它的dontAnimate()方法就好了,也就是去除加载前的动画效果。
4.开发过安卓的程序员就知道,ImageView有一个ScaleType属性,在Glide加载时我们可以通过fitCenter()和centerCrop方法直接在代码中对ImageView进行设置,至于为什么只有这两个,我也不是很清楚,一般情况下我习惯调用centerCrop,或者直接设置改ImageView的scale属性为“centerCrop”。
5.在开发的过程中,我还接触到diskCacheStrategy()方法。很明显,这是关于磁盘缓存的方法,通过一些资料的查询,我得知Glide会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。
具体说来就是:比如像淘宝的评论列表中通常会有缩略图对应的ImageView,而我们点开会在另外一个界面有一张大图对应的ImageView,虽然这是同一张图片,但因为大小的差异,Glide要下载两次。
因此我们可以通过调用diskCacheStrategy(DiskCacheStrategy.ALL)让Glide既缓存全尺寸又缓存其他尺寸。
除此之外,diskCacheStrategy()方法中还可以放入以下参数:
DiskCacheStrategy.NONE(不做任何磁盘缓存)
DiskCacheStrategy.RESULT(缓存转换后的资源)
DiskCacheStrategy.SOURCE(缓存源资源)
6.在Glide中有下面三个方法:
对应的我发现在Glide中可以调用placeholder()方法,其中的参数如下图:
这个方法是用来设置加载前的默认图片以及加载失败时的图片。