Glide,一个被google所推荐的图片加载库,作者是bumptech。这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app。Glide加载网络图片,Glide框架将逻辑封装的很好,用起来很简洁、很方便。

目前最稳定的是Glide3.7.0,今天记录一下使用方法

1.导入依赖,在build.gradle的dependencies中添加依赖,然后重构项目

implementation 'com.github.bumptech.glide:glide:3.7.0'

2.添加权限,使用网络加载的情况下,需要加入允许访问网络权限:在AndroidManifest.xml中添加

<uses-permission android:name="android.permission.INTERNET"/>

3.加载图片到imageview上,最基本的Glide使用

Glide.with(this)
        .load(url)
        .into(imageView);

其中load()中可以传入

1)、网络图片的url

2)、本地图片的file文件

3)、项目中的resource资源(R.drawable.image)

4)、图片的byte[]流

5)、图片的Uri对象

4.占位符(Placeholder)、错误符(Error)、后备回调符(Fallback)

占位符:占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。如果被请求的资源是从内存中加载出来的,那么占位符可能根本不会被显示。如果请求失败并且没有设置 error Drawable ,则占位符将被持续展示。类似地,如果请求的url/model为 null ,并且 error Drawable 和 fallback 都没有设置,那么占位符也会继续显示。

注意:placeholder()中可以传入Drawable对象、或者项目中的资源文件R.mipmap.holder;error()和fallback()皆是如此

Glide.with(this)
        .load(url)
        .placeholder(new ColorDrawable(Color.BLACK))
        .into(imageView);

错误符:error Drawable 在请求永久性失败时展示。error Drawable 同样也在请求的url/model为 null ,且并没有设置 fallback Drawable 时展示。

Glide.with(this)
        .load(url)
        .placeholder(new ColorDrawable(Color.BLACK))
        .error(R.mipmap.ic_launcher)
        .into(imageView);

后备回调符(Fallback):fallback Drawable 在请求的url/model为 null 时展示。设计 fallback Drawable 的主要目的是允许用户指示 null 是否为可接受的正常情况。例如,一个 null 的个人资料 url 可能暗示这个用户没有设置头像,因此应该使用默认头像。然而,null 也可能表明这个元数据根本就是不合法的,或者取不到。 默认情况下Glide将 null 作为错误处理,所以可以接受 null 的应用应当显式地设置一个 fallback Drawable 。

Glide.with(this)
        .load(url)
        .placeholder(new ColorDrawable(Color.BLACK))
        .error(R.mipmap.ic_launcher)
        .fallback(R.mipmap.fall)
        .into(imageView);

5.缓存

默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:

  1. 活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片?
  2. 内存缓存 (Memory cache) - 该图片是否最近被加载过并仍存在于内存中?
  3. 资源类型(Resource) - 该图片是否之前曾被解码、转换并写入过磁盘缓存?
  4. 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?

前两步检查图片是否在内存中,如果是则直接返回图片。后两步则检查图片是否在磁盘上,以便快速但异步地返回图片。

如果四个步骤都未能找到图片,则Glide会返回到原始资源以取回数据(原始文件,Uri, Url等Glide.with(this) .load(url) .placeholder(new ColorDrawable(Color.BLACK)) .error(R.mipmap.ic_launcher) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(imageView);

 

 

Glide.with(this)
        .load(url)
        .placeholder(new ColorDrawable(Color.BLACK))
        .error(R.mipmap.ic_launcher)
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .into(imageView);
  • DiskCacheStrategy.NONE 本地什么都不缓存
  • DiskCacheStrategy.SOURCE 本地缓存原始的全尺寸图片
  • DiskCacheStrategy.RESULT 本地缓存加载到ImageView上的较小尺寸的图片
  • DiskCacheStrategy.ALL 默认缓存全部尺寸的图片

6.跳过缓存

如果你想确保一个特定的请求跳过磁盘和/或内存缓存(比如,图片验证码 、实时更新的二维码),Glide 也提供了一些替代方案。

仅跳过内存缓存,请使用 skipMemoryCache() :

Glide.with(this)
        .load(url)
        .skipMemoryCache(true)
        .into(imageView);

仅跳过磁盘缓存,请使用 DiskCacheStrategy.NONE :

Glide.with(this)
        .load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .into(imageView);

这两个选项可以同时使用:

Glide.with(this)
        .load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true)
        .into(imageView);

7.加载Gif

给Glide传入一个gif的源url,那么

Glide.with( this )
        .load( gifUrl )
        .asGif()
        .error( R.drawable.error )
        .into( imageView );

如果要限制imageview展示的是静态图片,可用.asBitmap替代;若传入了一个gif的url,则显示该gif的第一帧图片

8.优先级

有时候一个页面有很多图片,但有主次之分。你希望主要的图片先被加载出来,之后在加载次要的图片。你可以通过指定请求优先级来实现这样的需求,有一点需要铭记在心的是:指定优先级只不过让优先级高的先请求,但由于图片大小,图片处理时间等等也需要时间,所以不能保证最后请求优先级高的一定最先显示
  先来看一下,Glide都有哪些请求优先级别:

Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE

9.加载显示的图片大小

可以用override(horizontalSize, verticalSize)指定要加载的图片大小,不过从实际情况来看,这种固定大小的时候很有可能导致显示的图片被拉伸或者压缩;所以你指定大小的时候,所以你还可以用fitCenter()或centerCrop()来缩放图片,用以达到比较好的视觉效果。

//缩放图片以满足ImageView的尺寸,超过ImageView的部分将会被裁剪掉,因此最终图片可能不完全显示。
Glide.with(this)
        .load(url)
        .override(500, 300)
        .centerCrop()  
        .into(imageView);
//保持原图片的比例进行缩放,直到可以在ImageView中尺寸区域内完全显示图片。
// 图片能够完全显示,比例保持不变,但是可能图片无法完全覆盖ImageView的区域。
Glide.with(this)
        .load(url)
        .override(500, 300)
        .fitCenter()  
        .into(imageView);

10.监听回调

通常情况下,我们用这些方法足够可以展示各种情况的图片;但是由于Glide封装的太好了,如果我们需要在图片加载失败或者加载过程中进行逻辑处理的话我们该怎么办呢?这时候要用到Glide的监听回调

Glide.with(this).load(url)
        .listener(new RequestListener<String, GlideDrawable>() {
            @Override
            public boolean onException(Exception e, String model,
                                       Target<GlideDrawable> target,
                                       boolean isFirstResource) {
                // 加载失败后的逻辑处理
                Toast.makeText(GlideCallBackActivity.this, "图片加载失败", Toast.LENGTH_SHORT).show();
                return false;
            }

            @Override
            public boolean onResourceReady(GlideDrawable resource, String model,
                                           Target<GlideDrawable> target,
                                           boolean isFromMemoryCache,
                                           boolean isFirstResource) {
                // 图片加载完成后的逻辑处理
                Toast.makeText(GlideCallBackActivity.this, "图片加载成功", Toast.LENGTH_SHORT).show();
                return false;
            }
        }).error(R.mipmap.ic_launcher_round)
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .into(imageView);

以上是Glide的常用的基本用法和相关的回调。