Glide 使用简单总结(整理郭霖Glide系列文章)
文中内容整理自郭霖Glide系列文章
郭霖 Glide
Glide 使用简单总结
基本使用
- 基本使用
Glide.with(this)
.load(url)
.into(imageView);
- 添加占位图
Glide.with(this)
.load(url)
.placeholder(本地图片)
.error(本地图片)
.into(imageView);
- 强制转换图片格式(动态gif图与静态bitmap)
// 强制静态图
Glide.with(this)
.load(url)
.asBitmap()
.placeholder(本地图片)
.error(本地图片)
.into(imageView);
// 强制动态图(注意如果不是动态图,会报错,但是添加了error()方法之后可以捕获)
Glide.with(this)
.load(url)
.asGif()
.placeholder(本地图片)
.error(本地图片)
.into(imageView);
- 指定图片大小(使用override方法)
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(100, 100) // 可以传入Target.SIZE_ORIGINAL表示原始图片大小
.into(imageView);
缓存
- 内存缓存(默认开启)
Glide.with(this)
.load(url)
.skipMemoryCache(true) // 传入true则表示不使用内存缓存
.into(imageView);
- 磁盘缓存(默认使用的是DiskCacheStrategy.RESULT)
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
引申使用
缓存使用key来进行本地缓存查找,有时候会有这样的情况,地址在变,但是其实图片还是同一个图片,例如七牛的图片有时候可能会带有一个token,像这样
http://url.com/image.jpg?token=d9caa6e02c990b0a
, token可能会变,但是图片还是同一个图片,如果直接使用是无法使用缓存的。这个时候需要对glide的GlideUrl进行一下改造。代码如下:
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
/**
* 关键就是这个getCacheKey, 在代码里面将它的token给屏蔽掉即可,那么Glide在缓存时使
* 用的key就是去掉token之后的key
* /
@Override
public String getCacheKey() {
return mUrl.replace(findTokenParam(), "");
}
private String findTokenParam() {
String tokenParam = "";
int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
if (tokenKeyIndex != -1) {
int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
if (nextAndIndex != -1) {
tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
} else {
tokenParam = mUrl.substring(tokenKeyIndex);
}
}
return tokenParam;
}
}
使用如下:
Glide.with(this)
.load(new MyGlideUrl(url)) // 在这里将url改为使用MyGlideUrl
.into(imageView);
回调与监听
- Target
先看一下Target的继承关系
Target 继承关系
其中有两个基本的Target
- SimpleTarget
单独使用比较灵活,但是写成代码有点难看
- ViewTarget
直接配合View写,将它添加到自定义View的内部,使用的时候简练
- SimpleTarget使用(比较简单,不多赘述)
// 此处的泛型可以是GlideDrawable或者Bitmap。
// 但是如果是Bitmap的话,调用的时候就需要添加asBitmap()方法
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
// TODO 在此处做一些其他需要做的事情
imageView.setImageDrawable(resource);
}
};
public void loadImage() {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(simpleTarget);
}
- ViewTarget
用于配合View集成使用,直接写到View的内部,其他和SimpleTarget差不多,只是写的位置不一样
// 写一个自定义View
public class MyLayout extends LinearLayout {
// 定义一个ViewTarget, 注意泛型
private ViewTarget<MyLayout, GlideDrawable> viewTarget;
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// 创建并重写代码,其实和SimpleTarget是一样的
viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
MyLayout myLayout = getView();
myLayout.setImageAsBackground(resource);
}
};
}
// 重要的是这个方法,使用Glide的时候需要调用这个方法来得到一个Target
public ViewTarget<MyLayout, GlideDrawable> getTarget() {
return viewTarget;
}
public void setImageAsBackground(GlideDrawable resource) {
setBackground(resource);
}
}
使用:
public void loadImage(MyLayout myLayout) {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
Glide.with(this)
.load(url)
.into(myLayout.getTarget()); // 就是这里调用
}
- preLoad
preLoad就是只加载,不显示,意思即可以先将图片缓存下来,在实际需要的时候再调用,那么就会从内存或者磁盘里面进行加载,这样速度快
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // 配合使用SOURCE
.preload();
- downloadOnly (略,可以查看郭霖 Glide)
- listener
Glide.with(this)
.load(url)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target,
boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
图片变换
- 基本变换
默认的图片变换是fitCenter,可能直接使用override进行大小指定,这样图片会按指定的大小进行加载显示,也可以使用图片变换,也可以两个同时使用
Glide.with(this)
.load(url)
.dontTransform() // 禁用变换
.into(imageView);
Glide.with(this)
.load(url)
.transform(...) // 使用变换
.into(imageView);
// 下面两个只是对transform的一个封装
Glide.with(this)
.load(url)
.centerCrop() // centerCrop
.into(imageView);
Glide.with(this)
.load(url)
.fitCenter() // fitCenter
.into(imageView);
- 自定义变换
重写BitmapTransform类(略),调用时将重写的BitmapTransform加到transform方法里面
- 使用变换库
Github Glide 变换库或者直接compile
dependencies {
compile 'jp.wasabeef:glide-transformations:2.0.2'
}
可以多个同时使用
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
.into(imageView);
Glide的自定义模块功能(略,参考郭霖 Glide 自定义模块)
- 自定义配置,缓存策略等
- 自定义组件,请求框架等