在APP显示图片时,拥有一个良好的体验是非常重要的,即图片不会突兀的出现,同样在出错时,需要有明显的提示,对于这些Glide都提供了接口,帮你去提升APP的体验。

占位图片:.placeholder
只需要调用.placeholder(),Glide将会显示它作为一个占位图片,直到实际的图片加载准备好。

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
        .into(imageView);

占位图片都是使用本地的图片,可以使用resourceId或者drawable。

错误占位图片:.error
在请求网络图片时,如果链接已经失效,APP应该显示一个错误的占位图片,告诉用户,无法访问。Glide也给提供一个选项去获得错误的回调,可以自定义行为,这个之后再讨论。

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
        .into(imageView);

与上面一样,error()接受的参数只能是已经初始化的 drawable 对象或者指明它的资源(R.drawable.resId)。

图片加载渐变效果:.crossFade

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
   .crossFade(1000)
        .into(imageView);

crossFade() 方法还有另外重载方法 .crossFade(int duration)。如果你想要去减慢(或加快)动画,随时可以传一个毫秒的时间给这个方法。动画默认的持续时间是 300毫秒。

关闭动画:.dontAnimate

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
   .dontAnimate()
        .into(imageView);

自定义动画:.animate
除了Glide自带的动画渐变效果之外,还可以自己定义动画。

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
   .animate(R.anim.rotate)
        .into(imageView);

animate方法中还有几个重载方法,支持设置动画资源,或者animation对象实例。

调整图片大小:.override
Glide 自动限制了图片的尺寸在缓存和内存中,并给到 ImageView 需要的尺寸。如果图片不会自动适配到 ImageView,调用 override(int width, int height) 。这将在图片显示到 ImageView之前重新改变图片大小。

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
   .animate(R.anim.rotate)
   .override(800,800)
        .into(imageView);

单独设置这个方法时,可能没有效果,这时我们可能还需要用到缩放centerCrop(),才能正常显示。

缩放图像
为了在调整图片大小时,可能会让图片长宽比例失真,这时需要避免这种情况,Glide提供了缩放图片的操作。提供了两个标准选项:centerCrop 和 fitCenter。

Glide.with(this)
                .load("http://imgsrc.baidu.com/forum/pic/item/968aad8fd8f152b6d439c92e.jpg")
        .placeholder(R.mipmap.ic_launcher)
   .error(R.mipmap.ic_launcher)
   .animate(R.anim.rotate)
   .override(800,800)
   .centerCrop()
        .into(imageView);

显示Gif
使用Glide显示Gif时,和加载普通图片并没有什么区别。

Glide.with(this)
                .load(R.drawable.gif_start)
   .diskCacheStrategy(DiskCacheStrategy.SOURCE)
   .centerCrop()
        .into(imageView);

注意,如果直接就加载Gif图片,可能会Gif非常缓慢,这时我们都需要为其添加缓存策略,如上。这样便能正常加载了。

进行Gif检查:.asGif()
上面的代码虽然可以加载Gif,但是还有一个潜在的问题是,如果提供的来源不是一个 Gif,可能只是一个常规图片,这就没有办法显示这个问题。Glide 接受 Gif 或者图片作为 load() 参数。如果你期望这个 URL 是一个 Gif,Glide 不会自动检查是否是 Gif。因此他们引入了一个额外的防区强制 Glide变成一个 Gif asGif():

Glide.with(this)
                .load(R.drawable.gif_start)
   .asGif()
   .error(R.drawable.error)
   .diskCacheStrategy(DiskCacheStrategy.SOURCE)
   .centerCrop()
        .into(imageView);

如上,如果load的资源是一个gif,这没有什么变化。但是如果不是Gif资源,Glide会将其当作失败来处理。这时.error()回调被调用,错误占位图片被显示。所以.asGif会强制校验图片是否为Gif。

Gif转为Bitmap:.asBitmap()
如果你仅仅想要显示 Gif 的第一帧,你可以调用 asBitmap() 去保证其作为一个常规的图片显示,即使这个 URL 是一个 Gif。

Glide.with(this)
                .load(R.drawable.gif_start)
   .asBitmap()
   .error(R.drawable.error)
   .diskCacheStrategy(DiskCacheStrategy.SOURCE)
   .centerCrop()
        .into(imageView);