Glide - 1 Glide的基本用法

2019-12-19  本文已影响0人  JunL_Dev
Start

前言

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

1. Glide 介绍

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

兼容性:

用 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 加载图片的生命周期,如果传入的是 Activit y或者 Fragment 的实例,那么当这个 Activity 或 Fragment 被销毁的时候,图片加载也会停止。如果传入的是 ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

// 加载本地图片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);

那么回顾一下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. 总结

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

End
上一篇 下一篇

猜你喜欢

热点阅读