文章都是参考郭霖的Glide系列的个人总结,更加方便与个人的使用的查找。
Glide 4 相较于 Glide 3 变动的主要是变动规则。性能上并没有什么突破性的升级,更多的是在 API 方便的优化,使之更加易读、易写、易扩展……
引入了 RequestOptions 对象,将一系列的 API 都移动到了 RequestOptions 中,可以摆脱冗长的 Glide 加载语句,还能进行自己的 API 封装。RequestOptions 可以作为参数传入到方法中。
RequestOptions options
= new RequestOptions()
.transforms()
.placeholder(R.drawable.place_holder)
.error(R.drawable.error)
// 可以指定加载图片的大小,不让 Glide 根据控件大小来决定图片大小
.override(200,200)
// 加载原图,Glide 不会自动压缩,容易 OOM
.override(Target.SIZE_ORIGINAL)
// 缓存策略默认开启,禁用方法
.skipMemoryCache(true)
// 禁用掉 Glide 的缓存功能
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
.asXxx() // asGif / asFile / asBitmap / asDrawable
.load(url)
.apply(options)
.listener()
// .preload
// .submit()
.into(ImageView / Target);
缓存策略:
Glide 分为内存缓存和硬盘缓存。
内存缓存 主要作用是防止应用重复将图片数据读取到内存中;
硬盘缓存 的只要作用是防止应用重复中网络或其他地方重复下载和读取数据。
.diskCacheStrategy()方法可以接收五种参数:
- DiskCacheStrategy.NONE:不缓存任何内容
- DiskCacheStrategy.DATA: 只缓存原始图片
- DiskCacheStrategy.RESOURCE: 只缓存转换后的图片
- DiskCacheStrategy.ALL:
- DiskCacheStrategy.AUTOMOTIC: 默认选项,让 Glide 根据图片资源智能选择使用哪种策略。
指定加载格式
Glide 可以自动识别 gif 图,并展示。
如果指定格式需要调用 asBitmap() / asGif() 方法。
Glide 4 中还增加了 asFile() / asDrawable(),分别用于强指定文件格式和加载和 Drawable 格式的加载。
// Glide 4中 asXxx() 必须在 load() 前面。
Glide.with(this).asXxx().load();
回调与监听
1. into()
into() 参数可以指定为 Target
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
imageView.setImageDrawable(resource);
}
};
public void loadImage(View view) {
Glide.with(this)
.load("http://guolin.tech/book.png")
.into(simpleTarget);
}
2. preload()
希望提前对图片进行一个预加载。有两个方法重载。一个可以指定图片大小。
// 图片预加载
Glide.with(this)
.load("http://guolin.tech/book.png")
.preload();
// 预加载图片的真正加载
Glide.with(this)
.load("http://guolin.tech/book.png")
.into(imageView);
3. submit()
用于下载图片,不能预加载。关于图片缓存的路径、访问获取缓存文件的方法。
对应 Glide 3 中的 downloadOnly()
submit() 可以替换 into()
也有两个重载方法:
- submit()
- submit(int width, int height); // 指定大小
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://www.guolin.tech/book.png";
// 此处 context 使得 下载任务跟随应用的生命周期,防止 Activity 销毁而任务被取消。
final Context context = getApplicationContext();
// submit 返回一个 FutureTarget 对象,进行异步加载。
FutureTarget<File> target = Glide.with(context)
.asFile() // 指定加载格式
.load(url)
.submit();
// 如果图片未加载完,就会阻塞在 get()
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();
4. listener()
用来监听 Glide 加载图片的状态。
Glide.with(this)
.load("http://www.guolin.tech/book.png")
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.into(imageView);
onResourceReady() / onLoadFailed() 的 Boolean 返回值:
表示事件是否已被处理,如果返回 true 则 不会再回调 Target 的 onResourceReady 方法 了。
图片变换 transforms()
对原始图片进行一些变换处理后展示给用户,包括 圆角化、圆形化、黑白化、模糊化 (高斯模糊) 等等
Github 上有个很好的库 glide-transformations
RequestOptions options = new RequestOptions()
.transforms(...);
// 有一些内置的变换 API
.centerCrop() / .fitCenter() / .circleCrop()
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
高级技巧 - 自定义模块
可以将 更改 Glide 配置,替换 Glide 组件等操作独立出来。可以对 Glide 进行自定义,并且和 Glide 的图片加载逻辑没有任何交集,也是一种低耦合编程方式的体现。
首先,定义一个自己的模块类,extend APPGlideModule
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// TODO: 用来更改Glide配置
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
// TODO: 替换Glide组件
}
}
网友评论