美文网首页
Glide - 1 Glide的基本用法

Glide - 1 Glide的基本用法

作者: JunL_Dev | 来源:发表于2019-12-19 19:52 被阅读0次
Start

前言

以前 App 里面经常使用 Glide 来加载图片,使用起来十分方便,但是里面的一些源码一直都没详细的看过,最近看了一下郭神(微信公众号:guolin_blog)对 Glide 的讲解十分详细,所以通过郭神的讲解,结合源码学习一下 Glide。

1. Glide 介绍

  • Glide 是一款由 Bump Technologies 开发的图片加载框架。
  • Glide 是适用于 Android 的快速有效的开源媒体管理和图像加载框架,它将媒体解码,内存和磁盘缓存以及资源池包装到一个简单易用的界面中。
  • Glide 支持获取,解码和显示视频静止图像,图像和动画 GIF。
  • Glide 包含灵活的 API,允许开发人员插入几乎所有网络堆栈。
  • 默认情况下,Glide 使用基于自定义 HttpUrlConnection 的堆栈,但还包含实用程序库,它们可以插入 Google 的 Volley 项目或 Square 的 OkHttp 库。
1.1 Glide 依赖

要想使用 Glide,首先需要将这个库引入到我们的项目当中。新建一个 GlideTest 项目,然后在app/build.gradle 文件当中添加如下依赖:
使用 Gradle:

dependencies {
    repositories {
  mavenCentral()
  google()
}

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.10.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}
}

或 Maven:

<dependency>
  <groupId>com.github.bumptech.glide</groupId>
  <artifactId>glide</artifactId>
  <version>4.10.0</version>
</dependency>
<dependency>
  <groupId>com.github.bumptech.glide</groupId>
  <artifactId>compiler</artifactId>
  <version>4.10.0</version>
  <optional>true</optional>
</dependency>

ProGuard 根据您的 ProGuard(DexGuard)配置和使用情况,您可能需要在 proguard.cfg 中包含以下几行:

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

兼容性:

  • 最低 Android SDK:Glide v4 要求最低 API 级别为 14。
  • 编译 Android SDK:Glide v4 要求您根据 API 26 或更高版本进行编译。

用 gradle 构建 Glide 非常简单:

git clone https://github.com/bumptech/glide.git
cd glide
./gradlew jar

注意:请确保您的 Android SDK 已安装了Android 支持存储库,并且您的 $ANDROID_HOME 环境变量指向该 SDK 或 local.properties 在根项目中添加了sdk.dir=...一行。

2. Glide 的使用

2.1 加载图片

核心代码如下:

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

Glide 加载图片就这么简单一行,但是这一行包括 加载网络上的图片、加载手机本地的图片、加载应用资源中的图片 等等。

  • with() : 首先,调用 Glide.with() 方法用于创建一个加载图片的实例。with() 方法可以接收 Context、Activity 或者 Fragment 类型的参数。也就是说我们选择的范围非常广,不管是在 Activity 还是 Fragment 中调用 with() 方法,都可以直接传 this。
    那如果调用的地方既不在 Activity 中也不在 Fragment 中呢?
    也没关系,我们可以获取当前应用程序的 ApplicationContext,传入到 with() 方法当中。

注意 with() 方法中传入的实例会决定 Glide 加载图片的生命周期,如果传入的是 Activit y或者 Fragment 的实例,那么当这个 Activity 或 Fragment 被销毁的时候,图片加载也会停止。如果传入的是 ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

  • load() : 这个方法用于指定待加载的图片资源。Glide 支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri 对象等等。因此 load() 方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用 load() 方法:
// 加载本地图片File file = getImagePath();
Glide.with(this).load(file).into(imageView);

// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);

// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);

// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
  • into() : 这个方法就很简单了,我们希望让图片显示在哪个 ImageView 上,把这个 ImageView 的实例传进去就可以了。当然,into() 方法不仅仅是只能接收ImageView类型的参数,还支持很多更丰富的用法,不过那个属于高级技巧,我们会在后面的文章当中学习。

那么回顾一下Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了。

2.2 占位图

占位图就是指在图片的加载过程中,我们先显示一张临时的图片,等图片加载出来了再替换成要加载的图片。
代码如下:

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

我们只是在刚才的三步走之间插入了一个 placeholder() 方法,然后将占位图片的资源 id 传入到这个方法中即可。
另外,这个占位图的用法其实也演示了 Glide 当中绝大多数 API 的用法,其实就是在 load()into() 方法之间串接任意想添加的功能就可以了。

有可能是根本看不到占位图效果的。因为 Glide 有非常强大的缓存机制,第一次加载图片的时候 Glide 自动就已经将它缓存下来了,下次加载的时候将会直接从缓存中读取,不会再去网络下载了,因而加载的速度非常快,所以占位图可能根本来不及显示。

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

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

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

关于 Glide 缓存方面的内容我们将会在后面的文章进行详细的讲解。

异常占位图 :首先准备一张error.jpg图片,然后修改 Glide 加载部分的代码,如下所示:

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);
2.3 指定图片格式

在加载图片格式上,Glide 比 Picasso 多支持的就是 GIF 图片。而加载代码和一般图片的一样,不需要添加额外的代码。

也就是说,不管我们传入的是一张普通图片,还是一张 GIF 图片, Glide 都会自动进行判断,并且可以正确地把它解析并展示出来。

当然,我们也可以控制图片的格式,比如将 GIF 变成静态图片,代码如下:

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

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

当然,我们也可以指定只加载 GIF 动态图片,和上面一样,只需要把 asBitmap() 换成 asGif() 即可:

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

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

2.4 指定图片大小

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

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

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

也正是因为 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 的大小是多少了。

3. 总结

  • 先with(),再load(),最后into()
  • Glide 自动缓存在本地,下次再加载直接从本地取
  • Glide 设置加载动图,但是加载静态图片的时候,会加载失败
  • Glide 会自动判断 ImageView 的大小

申明:开始结束的图片来源网络,侵删

End

相关文章

网友评论

      本文标题:Glide - 1 Glide的基本用法

      本文链接:https://www.haomeiwen.com/subject/tfasictx.html