文中內(nèi)容整理自郭霖Glide系列文章
郭霖 Glide
Glide 使用簡(jiǎn)單總結(jié)
基本使用
- 基本使用
Glide.with(this)
.load(url)
.into(imageView);
- 添加占位圖
Glide.with(this)
.load(url)
.placeholder(本地圖片)
.error(本地圖片)
.into(imageView);
- 強(qiáng)制轉(zhuǎn)換圖片格式(動(dòng)態(tài)gif圖與靜態(tài)bitmap)
// 強(qiáng)制靜態(tài)圖
Glide.with(this)
.load(url)
.asBitmap()
.placeholder(本地圖片)
.error(本地圖片)
.into(imageView);
// 強(qiáng)制動(dòng)態(tài)圖(注意如果不是動(dòng)態(tài)圖耸棒,會(huì)報(bào)錯(cuò),但是添加了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);
緩存
- 內(nèi)存緩存(默認(rèn)開(kāi)啟)
Glide.with(this)
.load(url)
.skipMemoryCache(true) // 傳入true則表示不使用內(nèi)存緩存
.into(imageView);
- 磁盤(pán)緩存(默認(rèn)使用的是DiskCacheStrategy.RESULT)
DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容媳叨。
DiskCacheStrategy.SOURCE: 表示只緩存原始圖片坝茎。
DiskCacheStrategy.RESULT: 表示只緩存轉(zhuǎn)換過(guò)后的圖片(默認(rèn)選項(xiàng))唠帝。
DiskCacheStrategy.ALL : 表示既緩存原始圖片雀摘,也緩存轉(zhuǎn)換過(guò)后的圖片赂鲤。
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
引申使用
緩存使用key來(lái)進(jìn)行本地緩存查找涯穷,有時(shí)候會(huì)有這樣的情況棍掐,地址在變,但是其實(shí)圖片還是同一個(gè)圖片求豫,例如七牛的圖片有時(shí)候可能會(huì)帶有一個(gè)token,像這樣
http://url.com/image.jpg?token=d9caa6e02c990b0a
塌衰, token可能會(huì)變诉稍,但是圖片還是同一個(gè)圖片蝠嘉,如果直接使用是無(wú)法使用緩存的。這個(gè)時(shí)候需要對(duì)glide的GlideUrl進(jìn)行一下改造杯巨。代碼如下:
public class MyGlideUrl extends GlideUrl {
private String mUrl;
public MyGlideUrl(String url) {
super(url);
mUrl = url;
}
/**
* 關(guān)鍵就是這個(gè)getCacheKey, 在代碼里面將它的token給屏蔽掉即可蚤告,那么Glide在緩存時(shí)使
* 用的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);
回調(diào)與監(jiān)聽(tīng)
- Target
先看一下Target的繼承關(guān)系
其中有兩個(gè)基本的Target
- SimpleTarget
單獨(dú)使用比較靈活,但是寫(xiě)成代碼有點(diǎn)難看
- ViewTarget
直接配合View寫(xiě)服爷,將它添加到自定義View的內(nèi)部杜恰,使用的時(shí)候簡(jiǎn)練
- SimpleTarget使用(比較簡(jiǎn)單获诈,不多贅述)
// 此處的泛型可以是GlideDrawable或者Bitmap。
// 但是如果是Bitmap的話(huà)心褐,調(diào)用的時(shí)候就需要添加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集成使用舔涎,直接寫(xiě)到View的內(nèi)部,其他和SimpleTarget差不多逗爹,只是寫(xiě)的位置不一樣
// 寫(xiě)一個(gè)自定義View
public class MyLayout extends LinearLayout {
// 定義一個(gè)ViewTarget, 注意泛型
private ViewTarget<MyLayout, GlideDrawable> viewTarget;
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// 創(chuàng)建并重寫(xiě)代碼亡嫌,其實(shí)和SimpleTarget是一樣的
viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
MyLayout myLayout = getView();
myLayout.setImageAsBackground(resource);
}
};
}
// 重要的是這個(gè)方法,使用Glide的時(shí)候需要調(diào)用這個(gè)方法來(lái)得到一個(gè)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()); // 就是這里調(diào)用
}
- preLoad
preLoad就是只加載掘而,不顯示挟冠,意思即可以先將圖片緩存下來(lái),在實(shí)際需要的時(shí)候再調(diào)用袍睡,那么就會(huì)從內(nèi)存或者磁盤(pán)里面進(jìn)行加載知染,這樣速度快
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);
圖片變換
- 基本變換
默認(rèn)的圖片變換是fitCenter,可能直接使用override進(jìn)行大小指定斑胜,這樣圖片會(huì)按指定的大小進(jìn)行加載顯示控淡,也可以使用圖片變換,也可以?xún)蓚€(gè)同時(shí)使用
Glide.with(this)
.load(url)
.dontTransform() // 禁用變換
.into(imageView);
Glide.with(this)
.load(url)
.transform(...) // 使用變換
.into(imageView);
// 下面兩個(gè)只是對(duì)transform的一個(gè)封裝
Glide.with(this)
.load(url)
.centerCrop() // centerCrop
.into(imageView);
Glide.with(this)
.load(url)
.fitCenter() // fitCenter
.into(imageView);
- 自定義變換
重寫(xiě)B(tài)itmapTransform類(lèi)(略)伪窖,調(diào)用時(shí)將重寫(xiě)的BitmapTransform加到transform方法里面
- 使用變換庫(kù)
Github Glide 變換庫(kù)或者直接compile
dependencies {
compile 'jp.wasabeef:glide-transformations:2.0.2'
}
可以多個(gè)同時(shí)使用
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
.into(imageView);
Glide的自定義模塊功能(略逸寓,參考郭霖 Glide 自定義模塊)
- 自定義配置,緩存策略等
- 自定義組件覆山,請(qǐng)求框架等