Android图片加载Glide的使用

Glide 3

添加依赖

Glide OR glide-transformations 选其一

Glide

1
2
//Glide
implementation 'com.github.bumptech.glide:glide:3.7.0'

glide-transformations

该库依赖于Glide,是处理图片的库,会自动下载Glide

1
2
3
//glide-transformations
implementation 'jp.wasabeef:glide-transformations:3.1.1'
implementation 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'

简单使用

1
Glide.with(this).load(R.mipmap.touxiang).into(head_imageview);

设置圆角

引用

1
2
3
4
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.load.resource.bitmap.RoundedCorners

Kotlin

1
2
3
4
5
6
7
8
9
10
11
val roundedCorners = RoundedCorners(6)
var options = RequestOptions.bitmapTransform(roundedCorners)
.override(180, 180)
.placeholder(R.mipmap.pic_error)//正在加载中的图片
.error(R.mipmap.pic_error)//加载失败的图片
.diskCacheStrategy(DiskCacheStrategy.ALL)//磁盘缓存策略

Glide.with(mContext)
.load(BaseConfig.baseALiUrl + item.schoologo)
.apply(options)
.into(imageView)

禁用缓存

常用与更新用户头像,但是头像地址不变的情况

Kotlin

1
2
3
4
5
6
7
8
var options = RequestOptions()
.centerCrop()
.placeholder(R.drawable.shape_common_light_white_bg)
.priority(Priority.HIGH).skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this).load(pic)
.apply(options)
.into(head_imageview);

Glide 4

对比

相比于Glide 3

  1. 将配置全部设置到了一个RequestOptions里面,并使用apply方法,应用这些配置信息
  2. 添加一个compiler的库,这个库是用于生成Generated API的,可以简化方法的调用

引用

Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 (Ice Cream Sandwich) 或更高。

Compile Sdk Version - Glide 必须使用 API 27 (Oreo MR1) 或更高版本的 SDK 来编译。

Support Library Version - Glide 使用的支持库版本为 27

如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 com.android.support。例如,假如你想使用 v26 的支持库:

1
2
3
4
5
6
dependencies {
implementation ("com.github.bumptech.glide:glide:4.9.0") {
exclude group: "com.android.support"
}
implementation "com.android.support:support-fragment:26.1.0"
}

Java

1
2
3
4
dependencies {
implementation 'com.github.bumptech.glide:glide:4.4.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
}

Kotlin

如果你在 Kotlin 编写的类里使用 Glide 注解,你需要引入一个 kapt 依赖,以代替常规的 annotationProcessor 依赖:

1
2
3
4
dependencies {
implementation 'com.github.bumptech.glide:glide:4.4.0'
kapt 'com.github.bumptech.glide:compiler:4.9.0'
}

请注意,你还需要在你的 build.gradle 文件中包含 kotlin-kapt插件:

1
apply plugin: 'kotlin-kapt'

权限

1
2
3
4
5
6
7
8
9
10
11
12
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"

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

<application>

</application>
</manifest>

proguard

如果你有使用到 proguard,那么请把以下代码添加到你的 proguard.cfg 文件中:

1
2
3
4
5
6
7
8
9
10
-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 *;
}

如果你的 target API 低于 Android API 27,请添加:
```pro
-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder

普通方式调用

加载图片

1
2
3
4
5
6
7
8
9
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.loading)//占位图
.error(R.drawable.error) //异常占位图
.override(200, 100)
.diskCacheStrategy(DiskCacheStrategy.NONE);//不进行磁盘缓存
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);

缓存策略

Glide 4.x版本的缓存选项,有下面5种:

  • DiskCacheStrategy.NONE: 表示不缓存任何内容。
  • DiskCacheStrategy.DATA: 表示只缓存原始图片。
  • DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
  • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
  • DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。

Glide 3中的语法是先load()再asBitmap()的,而在Glide 4中是先asBitmap()再load()的

Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载

文件下载

Glide 4中又新增了submit()/submit(int width, int height)方法,这个方法其实就是对应的Glide 3中的downloadOnly()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void downloadImage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://www.guolin.tech/book.png";
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
.asFile()
.load(url)
.submit();
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}

图片处理

Glide 4.x还提供了现成的图片转换的API:

1
2
3
RequestOptions options = new RequestOptions().centerCrop();
RequestOptions options = new RequestOptions().fitCenter();
RequestOptions options = new RequestOptions().circleCrop();

如果需要使用一些特殊转换,需要调用

1
RequestOptions options = new RequestOptions().transform();

配合下面这个库:

1
2
3
dependencies {
implementation 'jp.wasabeef:glide-transformations:3.0.1'
}

就可以进行方便的进行图片转换。使用示例如下:

1
2
3
4
5
6
7
String url = "https://up.sc.enterdesk.com/edpic/cf/3e/84/cf3e8415383e065b0fe8938f73bedf70.jpg";
RequestOptions options = new RequestOptions()
.transforms(new BlurTransformation(), new GrayscaleTransformation());
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);

GlideApp方式调用

Generated API是Glide 4中全新引入的一个功能,它的工作原理是使用注解处理器 (Annotation Processor) 来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilderRequestOptions和集成库中所有的选项。

简单说,就是Glide 4仍然给我们提供了一套和Glide 3一模一样的流式API接口,照顾老版本的用户的使用习惯。

只不过需要把Glide关键字替换成GlideApp关键字。

如下所示:

1
2
3
4
5
6
7
8
9
GlideApp.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(Target.SIZE_ORIGINAL)
.circleCrop()
.into(imageView);

不过,有可能你的IDE中会提示找不到GlideApp这个类。这个类是通过编译时注解自动生成的,但是要先先准备代码中,有一个自定义的模块,并给这个模块加上 @GlideModule 注解。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
@GlideModule
public class MyAppGlideModule extends AppGlideModule {

@Override
public void applyOptions(Context context, GlideBuilder builder) {

}

@Override
public void registerComponents(Context context, Glide glide, Registry registry) {

}
}

然后在Android Studio中点击菜单栏Build => Rebuild Project,GlideApp这个类就会自动生成了。

自定义API

下面我来具体举个例子

比如说我们要求项目中所有图片的缓存策略全部都要缓存原始图片,那么每次在使用Glide加载图片的时候,都去指定diskCacheStrategy(DiskCacheStrategy.DATA)这么长长的一串代码,确实是让人比较心烦。

这种情况我们就可以去定制一个自己的API了,定制自己的API需要借助 @GlideExtension@GlideOption这两个注解。创建一个我们自定义的扩展类

代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
@GlideExtension
public class MyGlideExtension {

private MyGlideExtension() {
}

@GlideOption
public static void cacheSource(RequestOptions options) {
options.diskCacheStrategy(DiskCacheStrategy.DATA);
}
}

注意自定义API的方法都必须是静态方法,而且第一个参数必须是RequestOptions,后面你可以加入任意多个你想自定义的参数。在cacheSource()方法中,我们仍然还是调用的diskCacheStrategy(DiskCacheStrategy.DATA)方法,所以说cacheSource()就是
一层简化API的封装而已。

然后在Android Studio中点击菜单栏Build -> Rebuild Project,神奇的事情就会发生了,你会发现你已经可以使用这样的语句来加载图片了:

1
2
3
4
GlideApp.with(this)
.load(url)
.cacheSource()
.into(imageView);