【笔记】Android高效图片加载库Glide

前言

Glide is a fast and efficient open source media management and image loading framework for Android that wraps media decoding, memory and disk caching, and resource pooling into a simple and easy to use interface.(Github

引入Glide依赖

app/build.gradle
1
2
3
4
5
6
dependencies {

...

implementation 'com.github.bumptech.glide:glide:4.11.0'
}

添加网络权限

  • 在清单文件的<application></application>之外添加网络权限
app/src/main/AndroidManifest.xml
1
<uses-permission android:name="android.permission.INTERNET" />

使用Glide

在布局中添加图片控件

app/src/main/res/layout/activity_main.xml
1
2
3
4
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

在Java中使用Glide渲染图片

直接渲染图片

  • 将网络图片渲染到ImageView中

<url>:网络图片资源地址

app/src/main/java/.../MainActivity.java
1
2
3
4
ImageView imageView = findViewById(R.id.iv);
Glide.with(this)
.load("<url>")
.into(imageView);
使用占位符
  • 可以同时配置多个占位符配置,也可以只配置一个占位符配置

.placeholder():正在请求图时展示的占位符图片
.error():请求失败时展示的占位符图片,如果没有设置默认展示.placeholder()配置的占位符图片
.fallback():请求为空时展示的占位符图片,如果没有设置默认展示.placeholder()配置的占位符图片
.override(<width>, <height>):强制指定占位符图片宽高,单位px,如果没有指定则跟随ImageView的配置

.apply(requestOptions):应用配置

app/src/main/java/.../MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
ImageView imageView = findViewById(R.id.iv);

RequestOptions requestOptions = new RequestOptions()
.placeholder(R.drawable.图片名)
.error(R.drawable.图片名)
.fallback(R.drawable.图片名);

Glide.with(this)
.load("<url>")
.apply(requestOptions)
.into(imageView);
占位符的过渡动画
  • 从占位符渲染为真正的图片时的过渡动画

  • Glide默认实现了交叉淡入效果,可以直接使用

  • 使用默认的Drawable方式

.transition(DrawableTransitionOptions.withCrossFade(<time>)):可以指定过渡动画的展示时间

app/src/main/java/.../MainActivity.java
1
2
3
4
5
6
7
8
9
10
ImageView imageView = findViewById(R.id.iv);

RequestOptions requestOptions = new RequestOptions()
.placeholder(R.drawable.图片名);

Glide.with(this)
.load("<url>")
.apply(requestOptions)
.transition(DrawableTransitionOptions.withCrossFade(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build()))
.into(imageView);
  • 使用Bitmap方式

.transition(BitmapTransitionOptions.withCrossFade(<time>)):可以指定过渡动画的展示时间

app/src/main/java/.../MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
ImageView imageView = findViewById(R.id.iv);

RequestOptions requestOptions = new RequestOptions()
.placeholder(R.drawable.图片名);

Glide.with(this)
.asBitmap()
.load("<url>")
.apply(requestOptions)
.transition(BitmapTransitionOptions.withCrossFade(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build()))
.into(imageView);
图形变换
  • 使用图形变换时,只有对.jpeg格式的图片有效
圆形
app/src/main/java/.../MainActivity.java
1
2
3
4
Glide.with(this)
.load("https://s.cn.bing.net/th?id=OHR.TaihuCherry_ZH-CN9040685764_UHD.jpg")
.transform(new CircleCrop())
.into(imageView);
圆角
  • 四个角同时指定弧度值,都根据指定弧度变换为圆角

<reg>:四个角的弧度值

app/src/main/java/.../MainActivity.java
1
2
3
4
Glide.with(this)
.load("https://s.cn.bing.net/th?id=OHR.TaihuCherry_ZH-CN9040685764_UHD.jpg")
.transform(new RoundedCorners(<reg>))
.into(imageView);
  • 四个角单独指定弧度值,都根据指定弧度变换为圆角

<reg_left_top>:左上角的弧度值
<reg_right_top>:右上角的弧度值
<reg_right_bottom>:右下角的弧度值
<reg_left_bottom>:左下角的弧度值

app/src/main/java/.../MainActivity.java
1
2
3
4
Glide.with(this)
.load("https://s.cn.bing.net/th?id=OHR.TaihuCherry_ZH-CN9040685764_UHD.jpg")
.transform(new GranularRoundedCorners(<reg_left_top>, <reg_right_top>, <reg_right_bottom>, <reg_left_bottom>))
.into(imageView);
旋转
  • 根据指定的角度顺时针进行旋转

<reg>:旋转的角度

app/src/main/java/.../MainActivity.java
1
2
3
4
Glide.with(this)
.load("https://s.cn.bing.net/th?id=OHR.TaihuCherry_ZH-CN9040685764_UHD.jpg")
.transform(new Rotate(<reg>))
.into(imageView);

Glide扩展

  • Glide注解处理器的使用
  • 在类上通过注解的方式,生成一个更加高效的Glide类

引入Glide注解处理器依赖

app/build.gradle
1
2
3
4
5
6
dependencies {

...

annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}

使用GlideApp类

创建配置类

  • 创建一个MyGlideModule类(类名自定义)作为配置类,继承自AppGlideModule类,并在类上添加@Glidemodule注解,用于生成GlideApp类
app/src/main/java/.../MyGlideModule.java
1
2
3
@GlideModule
public class MyGlideModule extends AppGlideModule {
}
  • 创建配置类后重新编译项目即可完成GlideApp类的生成

使用GlideApp类添加占位符配置

  • 使用GlideApp类,可以使用流式API添加占位符配置,而不需要创建RequestOptions对象
1
2
3
4
GlideApp.with(this)
.load("<url>")
.placeholder(R.drawable.图片名)
.into(imageView);

使用频繁使用的选项集合进行配置

创建配置类

  • 创建一个MyGlideExtension类(类名自定义)作为配置类,并添加@GlideExtension注解
  • 必须创建一个私有无参构造
  • 将频繁使用的配置提取为配置集,创建静态方法,返回配置集,并在方法上添加@GlideOption注解
    • 配置集方法名可以自定义
    • 配置集方法可以指定多个
    • 变换效果不能在配置集中配置
app/src/main/java/.../MyGlideExtension.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@GlideExtension
public class MyGlideExtension {

private MyGlideExtension() {}

@GlideOption
public static BaseRequestOptions<?> defaultOption(BaseRequestOptions<?> options) {
// 返回配置集
// 例如当所有图片占位符相同时,配置占位符配置集
return options
.placeholder(R.drawable.图片名)
.error(R.drawable.图片名)
.fallback(R.drawable.图片名);
}

}
  • 创建配置类后重新编译项目,使配置集方法生效

使用配置集

  • 使用配置集可以提高创建对象的效率

defaultOption():配置集方法名

app/src/main/java/.../MainActivity.java
1
2
3
GlideApp.with(this)
.load("<url>")
.defaultOption();

完成

参考文献

哔哩哔哩——Android架构解析