首先Glide在github上的地址:https://github.com/bumptech/glide;集成进项目里面都有介绍,跟着走就行。反编译的话则需要如下操作:
之后是最基础的用法:
再然后缓存的内容,就 Glide 的缓存策略而言,其实我们也是有办法去调整的。
对于内存缓存而言,只有有或者没有的情况,所以 Glide 只提供了一个 skipMemoryCache() 方法,它可以传递一个 Boolean 的值,用于指定是否跳过磁盘缓存,默认情况下是 false ,表示需要内存缓存。如果我们需要对磁盘缓存进行调节,就需要使用 diskCacheStrategy()
方法来改变它,前面提到它是一种比较复杂的策略,所以无法简单的使用一个 Boolean 值就完成了。它需要传递一个 DiskCacheStrategy 的枚举类型。
可以看到,它实际上是通过两个参数来标记磁盘缓存的策略的。
ALL:缓存所有类型的图片(默认行为)。
NONE :禁用磁盘缓存。
SOURCE : 只缓存全尺寸的原图。
RESULT :只缓存压缩后的图片。
Glide 是可以在加载中,对当前加载的图片,调整加载的优先级的。需要使用 priority() 方法,它可以接受一个 Priority 的枚举类型,包含四种值:LOW(低)、HIGH(高)、NORMAL(普通)、IMMEDIATE(立即)。
Glide 在显示图片的时候,为了让显示效果不那么突兀,会以一种更柔和的方式去显示,就会在加载的时候给一个动画效果,它可以使用 crossFade() 方法进行配置,如果不特殊处理,默认它是开启的,并且本身默认动画的时长是 300ms。而 crossFade() 的效果是默认开启的,所以如果我们不需要这样的一个动画效果,可以使用 dontAnimate() 来禁用动画效果。有一些情况下,crossFade() 方法并不能满足我们的需求。如果对加载的动画有特殊的定制需要,可以使用更灵活的 animate() 方法来自己实现动画。
Glide还支持加载gif格式的图片,与平常的JPG等用法一致,并增加了asGif() 来进行校验,如果当前加载的图片不是一个正确的 Gif 格式,则会去显示 error() 配置的图片。当然,有时候我们可能只是为了显示一张图片,可以强制显示 Gif 图片的第一帧,使用 asBitmap() 方法标记即可。只需要将 asGif() 替换成 asBitmap() 就饿可以了,这里不再单独提供示例了。
如果有对 Glide 加载的图片的结果进行监听的,可以使用 listener()
方法设置一个监听器,它接收一个 RequestListener 的接口
一般而言,如果我们需要监听图片加载错误的原因,可以在 onException()
中做处理。
需要注意的是,这两个方法的返回值,最好都是 false,因为如果返回 true ,将表示你已经处理了这次的事件,而 Glide 将不会再做额外的处理。例如,如果 onException()
返回了 true 的话,在图片加载失败之后,error()
中设置的图片,并不会被显示,因为 Glide 认为开发者已经在外部对这个错误进行了处理。
对于使用 Glide 加载的图片,如果想要在其显示之前,对其进行一些变换操作,例如,改变颜色、虚化、圆角子类的,都需要用到 transfrom() 方法,它主要用于支持在图片显示之前,自定义的变换效果。这个库不错https://github.com/wasabeef/glide-transformations
前面所有的例子中,into()
方法作为 Glide 加载图片流程的最后一个环节,它不仅仅只能支持一个 ImageView。有时候我们还需要给 View 中设置一个背景的需要,这个使用 Glide 也是可以办到的,但是就需要用到 into()
方法的其他重载方法了。
撇开 into(ImageView) 不说,into(int,int) 实际上是一个指定尺寸的同步方法,可以在子线程中,通过它来得到一个 GlideDrawable 对象。
但是这并不是很常用的场景,大部分我们还是使用泛型的方式来使用 Glide 的。
它的完整签名可以看出,它实际上接收的是一个 Target 对象,而 Glide 同时也提供了非常多的 Target 的子类。
这些子类里面,有一些是不常用的,例如 AppWidgetTarget 和 NotificationTarget 就是为了 AppWidget 和 Notification 中加载图片准备的。这里只介绍两个比较常用的 Target :SimpleTarget 和 ViewTarget ,其实使用起来都是大同小异。
如果我们不关心图片加载的用途,只是单纯的需要加载一个 Bitmap 或者 Drawable ,就可以使用 SimpleTarget 来处理。
SimpleTarget 可以接受一个 GlideDrawable 或者 Bitmap 的类型作为加载的类型。如果需要指定加载的图片尺寸,还可以在构造方法中指定,如果不对其进行指定,则加载的是图片的原尺寸。
再来看看 ViewTarget, 从名称上可以才出来,它实际上是想让 Glide 加载一个图片资源给某个 View 使用。它可以解决有时候我们显示图片的 View 并不是一个 ImageView 的问题,也可能是一个 View 的背景。
ViewTarget 需要指定 View 的类型,以及加载的资源类型,这里直接使用的 View 和 GlideDrawable ,然后将我们需要的使用图片的目标 View 当构造参数传递进去即可,最终它它会一个内部 view 变量去持有它,供之后使用。
在 onResourceReady() 这个回调方法中,直接按我们的需要使用 GlideDrawable 和 View 即可。
如果是需要在非 ImageView 的其他 View 上使用图片,推荐使用 ViewTarget 。它内部是会去计算 View 的尺寸,来优化缓存的图片。和加载 ImageView 的效果是一样的,如果使用 SimpleTarget 就需要考虑到 View 的尺寸问题了。
在使用 Target 的时候,还有一点需要额外注意的。
前面也提到,Glide 此次加载的图片生命周期,会和 with() 传递进去的 Context 的生命周期进行绑定,所以使用 Target 加载图片的时候,就需要额外注意了,如果不是和页面绑定的图片资源,可以使用 ApplicationContext() ,避免当前页面被销毁之后,加载的请求也被停止了。