用法
- 基本用法
Glide.with(fragment)
.load(url)
.into(imageView);
Glide.with(fragment).clear(imageView);
- 模块的定义
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
生成的 API 默认名为 GlideApp
,与 AppGlideModule
的子类包名相同。在 Application 模块中将 Glide.with()
替换为 GlideApp.with()
,即可使用该 API 去完成加载工作。
GlideApp.with(fragment)
.load(myUrl)
.placeholder(placeholder)
.fitCenter()
.into(imageView);
- RecyclerView 中的使用
Glide 已经处理了 View 的复用并且会自动取消请求
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String url = urls.get(position);
Glide.with(fragment)
.load(url)
.into(holder.imageView);
}
- 非View
Glide.with(context
.load(url)
.into(new CustomTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<Drawable> transition) {
// Do something with the Drawable here.
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
// Remove the Drawable provided in onResourceReady from any Views and ensure
// no references to it remain.
}
});
- 后台线程使用
submit
FutureTarget<Bitmap> futureTarget =
Glide.with(context)
.asBitmap()
.load(url)
.submit(width, height);
Bitmap bitmap = futureTarget.get();
...
Glide.with(context).clear(futureTarget);
同样也可以在后台线程启动异步加载,哪怕你后台线程根本不需要 Bitmap 或 Drawable
Glide.with(context)
.asBitmap()
.load(url)
.into(new Target<Bitmap>() {
...
});
- 占位符
Glide允许用户指定三种不同类型的占位符,分别在三种不同场景使用
- placeholder
占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。 - error
error Drawable 在请求永久性失败时展示 - fallback
fallback Drawable 在请求的url/model为 null 时展示。
GlideApp.with(fragment)
.load(url)
.placeholder(R.drawable.placeholder) // error(R.drawable.error) | fallback(new ColorDrawable(Color.GREY))
.into(view);
- Options
- RequestBuilder
RequestBuilder 通过 Glide.with() 返回,可以应用 placeHolder、Transformations、cacheStrategies、Component options
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).asDrawable();
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).load(url);
- RequestOptions
RequestOptions cropOptions = new RequestOptions().centerCrop(context);
...
Glide.with(fragment)
.load(url)
.apply(cropOptions)
.into(imageView);
这里主要说明的是 apply()
方法,它可以被调用很多次,如果调用中会有重复的,以最后一次为准
- TransitionOptions
它主要是应用在请求加载完成以后,我们可以用它渐入、从placeholder渐入、无
Glide.with(fragment)
.load(url)
.transition(withCrossFade())
.into(view);
- Thumbnail Request
用来加载缩略图
Glide.with(fragment)
.load(url)
.thumbnail(Glide.with(fragment) // thumbnail(/*sizeMultiplier=*/ 0.25f) 原图的百分比
.load(thumbnailUrl))
.into(imageView);
- Component Options
主要是用来设置组件,如ModelLoaders
,ResourceDecoders
,ResourceEncoders
,Encoders
等
Glide.with(context)
.load(url)
.apply(option(MyCustomModelLoader.TIMEOUT_MS, 1000L))
.into(imageView);
RequestOptions options = new RequestOptions()
.set(MyCustomModelLoader.TIMEOUT_MS, 1000L);
Glide.with(context)
.load(url)
.apply(options)
.into(imageView);
- 变换
是获取资源并修改它,然后返回被修改后的资源。通常变换操作是用来完成剪裁或过滤,也可以用于转换GIF动画,甚至自定义的资源类型。
- 内置变换
CenterCrop
,FitCenter
,CircleCrop
RequestOptions options = new RequestOptions();
options.centerCrop();
Glide.with(fragment)
.load(url)
.apply(options)
.into(imageView);
- 多重变换
Glide.with(fragment)
.load(url)
.transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
.into(imageView);
- 自定义变换
主要是是继承BitmapTransformation
,然后重写transform
方法,以及equals()
,hashCode()
,
updateDiskCacheKey()
- Target
Target<Drawable> target =
Glide.with(fragment)
.load(url)
.into(new Target<Drawable>() {
...
});
...
// Some time in the future:
Glide.with(fragment)
.load(newUrl)
.into(target);
- 过渡
在 Glide 中,图像可能从四个地方中的任何一个位置加载出来:- Glide 的内存缓存
- Glide 的磁盘缓存
- 设备本地可用的一个源文件或 Uri
- 仅远程可用的一个源 Url 或 Uri
- 配置
- 添加组件
- 添加
AppGlideModule
- (可选)添加
LibraryGlideModule
一个或多个 - module 都需要加上
@GlideModule
注解 - 添加 gradle 依赖
- 在 proguard 中,添加对
AppGlideModule
的 keep
- 添加
- 缓存
// 内存缓存
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.setMemoryCacheScreens(2)
.build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
}
}
// Bitmap池
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.setBitmapPoolScreens(3)
.build();
builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
}
}
// 磁盘缓存
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
}
}
- 默认选项
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDefaultRequestOptions(
new RequestOptions()
.format(DecodeFormat.RGB_565)
.disallowHardwareBitmaps());
// 在加载图片时假如发生了一个异常 (例如, OOM),
//Glide 将会使用一个 GlideExecutor.UncaughtThrowableStrategy
final UncaughtThrowableStrategy myUncaughtThrowableStrategy = new ...
builder.setDiskCacheExecutor(newDiskCacheExecutor(myUncaughtThrowableStrategy));
builder.setResizeExecutor(newSourceExecutor(myUncaughtThrowableStrategy));
}
}
一旦创建了新的请求,这些选项将通过 GlideBuilder 中的 setDefaultRequestOptions 被应用上。因此,任何单独请求里应用的选项将覆盖 GlideBuilder 里设置的冲突选项。
- 缓存
GlideApp.with(fragment)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 本地和远程
// .onlyRetrieveFromCache(true) 仅从缓存加载图片
// .skipMemoryCache(true) 跳过缓存
// .signature(new ObjectKey(yourVersionMetadata)) 定制签名用于定制缓存
.into(imageView);
- 资源重用
每次调用into()
来加载一个资源,这个资源的引用计数会被加一。如果相同的资源被加载到两个不同的Target
,则在两个加载都完成后,它的引用计数将会为二。我们可以通过clear()
和请求新的资源来减少计数。当计数为0 时,资源会被释放给 Glide以重用。
也可以用我们在 配置中提到的 BitmapPool
网友评论