前言
在写本教程时, Glide 的版本号是3.7。
简介
- 相关网址:GitHub地址、英文文档。
- Glide 是一个媒体管理框架,支持图片、原生视频的加载,包括从网络上加载。
相关概念
-
Target
:可以指ViewTarget
(含View
)或SimpleTarget
(不含View
)。 -
Signature
:签名,可以唯一地标识一个对象。 -
Resource.recycle()
:表示该资源不被引用,可以被回收。
简单示例
创建Glide
Glide.with(this)
.load(/* 加载源 */)
.into(imageView);
Glide
的简单配置项
- 设置绑定的生命周期:
with(this)
- 设置加载资源:
load(/* 加载源 */)
,加载源可以是如下几种类型对象:-
byte[]
:字节数组。 -
String
:可以是文件路径或者Url等。 -
Integer
:资源id。 -
File
:文件。 -
Uri
:数据。
-
- 设置加载的优先级:
priority(/* 优先级 */)
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
- 设置“加载中”占位图片:
placeholder(/* 加载源 */)
- 设置“加载失败”占位图片:
error(/* 加载源 */)
- 设置gif为静态:
asBitmap()
- 设置gif为动态:
asGif()
- 设置加载动画为无动画:
dontAnimate()
- 设置加载动画为淡入淡出动画:
crossFade(/* 动画时间 */)
- 设置加载动画为自定义动画:
animate(R.anim.id)
- 设置尺寸:
override(800, 800)
- 设置裁剪策略为拉伸裁剪:
centerCrop()
- 设置裁剪策略为拉伸不裁剪:
fitCenter()
Glide
的复杂配置项
缩略图
简介
- 缩略图 :在图片加载过程中显示的图片。
简单的缩略图加载
- 简单的 缩略图 是和 原图 一起加载的。
.thumbnail(0.1f)
独立的缩略图加载
- 缩略图 的加载是和 原图 的加载相互独立的。
- 以下代码可以多次递归,即设置 原图 的 缩略图 , 缩略图 又设置其 缩略图 ,可实现从模糊到清晰的加载过程。
DrawableRequestBuilder thumbnailRequest = Glide
.with(context)
.load(eatFoodyImages[2]);
.thumbnail(thumbnailRequest)
错误调试
简介
-
RequestListener.onException(...)
:资源加载出错时调用。 -
RequestListener.onResourceReady(...)
:资源加载完成时调用。
1. 创建RequestListener
RequestListener errorListener = new RequestListener() {
@Override
public boolean onException(Exception e, String model, Target target,
boolean isFirstResource) {
Log.e("onException", e.toString() + " model:" + model + " isFirstResource: " + isFirstResource);
imageView.setImageResource(R.mipmap.ic_launcher);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target target,
boolean isFromMemoryCache, boolean isFirstResource) {
Log.e("onResourceReady", "isFromMemoryCache:" + isFromMemoryCache + " model:" + model
+ " isFirstResource: " + isFirstResource);
return false;
}
};
2. 绑定RequestListener
.listener(errorListener)
加载图片到通知
- 先创建一个
NotificationTarget
对象,再load(NotificationTarget)
即可实现目标。具体使用方法看NotificationTarget
构造方法。
加载图片到应用小控件
- 先创建一个
AppWidgetTarget
对象,再load(AppWidgetTarget)
即可实现目标。具体使用方法看AppWidgetTarget
构造方法。
缓存
简介
- Glide 默认使用 内存缓存 和 磁盘缓存 来避免不必要的网络请求。
缓存策略
- 跳过 内存缓存 :
skipMemoryCache(true)
- 跳过 磁盘缓存 :
diskCacheStrategy(/* 磁盘缓存策略 */)
-
DiskCacheStrategy.ALL
:如果你请求一个 1000x1000像素 的图片,你的ImageView
是 500x500像素 , Glide 会缓存两种尺寸的图片。 DiskCacheStrategy.NONE
-
DiskCacheStrategy.SOURCE
:只缓存图片转换前的数据。 -
DiskCacheStrategy.RESULT
:只缓存图片转换后的数据。如果你请求一个 1000x1000像素 的图片,你的ImageView
是 500x500像素 ,则只缓存后者。
-
缓存失效【Todo】
官方教程
自定义Target
SimpleTarget
简介
-
SimpleTarget
的 泛型 参数可以是Bitmap
或Drawable
。 -
SimpleTarget
不可用于自定义 View 。 - 可以通过
SimpleTarget
获取Bitmap
或Drawable
对象,手动加载到需要的地方。 - 不要把
SimpleTarget
对象定义为 匿名内部类 ,而是定义为 类属性 ,以避免被Android
回收机制回收,从而永远不会进行回调。
1. 创建SimpleTarget
SimpleTarget target = new SimpleTarget(/* 长 */, /* 宽 */) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
// 获取到bitmap
imageView1.setImageBitmap(bitmap);
}
};
2. 绑定SimpleTarget
// noinspection unchecked
Glide
.with(context) // 如果是在Activity生命周期外请求的话,需要使用application context。
.load(url)
.asBitmap() // 通过asBitmap(),避免当资源是视频等,会出现未知格式的情况。
.into(target);
ViewTarget
简介
-
ViewTarget
可用于自定义 View 。 -
ViewTarget
与SimpleTarget
的区别是ViewTarget
内部含有 View 。
1. 创建ViewTarget
ViewTarget viewTarget = new ViewTarget(customView) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation super GlideDrawable> glideAnimation) {
this.view.setImage(resource.getCurrent());
}
};
2. 绑定ViewTarget
.into(target)
自定义BitmapTransformation
1. 定义BitmapTransformation
public class BlurTransformation extends BitmapTransformation {
private RenderScript rs;
public BlurTransformation(Context context) {
super(context);
rs = RenderScript.create(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap blurredBitmap = toTransform.copy(Bitmap.Config.ARGB_8888, true);
// 分配内存
Allocation input = Allocation.createFromBitmap(
rs,
blurredBitmap,
Allocation.MipmapControl.MIPMAP_FULL,
Allocation.USAGE_SHARED
);
Allocation output = Allocation.createTyped(rs, input.getType());
// Load up an instance of the specific script that we want to use.
ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setInput(input);
// Set the blur radius
script.setRadius(10);
// Start the ScriptIntrinisicBlur
script.forEach(output);
// Copy the output to the blurred bitmap
output.copyTo(blurredBitmap);
toTransform.recycle();
return blurredBitmap;
}
@Override
public String getId() {
return "blur";
}
}
2. 应用变换
- 方式一:
.transform(new BlurTransformation(context))
- 方式二:
.bitmapTransform(new BlurTransformation(context))
- 方式三(多重变换):
.transform(new GreyscaleTransformation(context), new BlurTransformation(context))
Glide Modules
简介
- 通过实现
GlideModule
接口并在 AndroidManifest.xml 中注册来实现。 - 可以同时注册多个
GlideModule
类,不过要确保没有冲突。 - 如果想要禁止
GlideModule
,只要从 AndroidManifest.xml 里移除它。
1. 定义GlideModules
类
GlideModules
外壳
public class SimpleGlideModule implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) {
// todo
}
@Override public void registerComponents(Context context, Glide glide) {
// todo
}
}
重写applyOptions()
1. 自定义内存缓存
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
2. 自定义磁盘缓存
int cacheSize100MegaBytes = 104857600;
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheSize100MegaBytes));
// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSize100MegaBytes));
int cacheSize100MegaBytes = 104857600;
String downloadDirectoryPath = Environment.getDownloadCacheDirectory().getPath();
builder.setDiskCache(new DiskLruCacheFactory(downloadDirectoryPath, cacheSize100MegaBytes));
// 子目录
// builder.setDiskCache(new DiskLruCacheFactory(downloadDirectoryPath, "glidecache", cacheSize100MegaBytes));
3. 自定义图片质量
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
// builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);
4. 其他
-
GlideBuilder.setDiskCacheService()
:设置请求的资源在 磁盘缓存 里的时候需要执行的ExecutorService
。 -
GlideBuilder.setResizeService()
:设置请求的资源不在 磁盘缓存 里的时候需要执行的ExecutorService
。
重写registerComponents()
使用OkHttp实现从Https中加图片
工具类:OkHttpUrlLoader、OkHttpStreamFetcher
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(httpsOkHttpClient));
2. 注册
在 AndroidManifest.xml 中:
...
Glide Transformations
简介
- 官网:Glide Transformations
- 例子:Glide Transformations
- 可以对 Glide 加载的图片进行转换。
简单示例
单个转换
Glide.with(this).load(R.drawable.demo)
.bitmapTransform(new BlurTransformation(context))
.into((ImageView) findViewById(R.id.image));
多个转换
Glide.with(this).load(R.drawable.demo)
.bitmapTransform(new BlurTransformation(context, 25), new CropCircleTransformation(context))
.into((ImageView) findViewById(R.id.image));
Crop
CropTransformation
CropCircleTransformation
CropSquareTransformation
RoundedCornersTransformation
Color
ColorFilterTransformation
GrayscaleTransformation
Blur
BlurTransformation
Mask(掩模)
MaskTransformation
GPU Filter(滤镜)
ToonFilterTransformation
SepiaFilterTransformation
ContrastFilterTransformation
InvertFilterTransformation
PixelationFilterTransformation
SketchFilterTransformation
SwirlFilterTransformation
BrightnessFilterTransformation
KuwaharaFilterTransformation
VignetteFilterTransformation