文章都是參考郭霖的Glide系列的個(gè)人總結(jié)确封,更加方便與個(gè)人的使用的查找暇韧。
Glide 4 相較于 Glide 3 變動(dòng)的主要是變動(dòng)規(guī)則缸浦。性能上并沒(méi)有什么突破性的升級(jí),更多的是在 API 方便的優(yōu)化渣慕,使之更加易讀嘶炭、易寫(xiě)、易擴(kuò)展……
引入了 RequestOptions 對(duì)象逊桦,將一系列的 API 都移動(dòng)到了 RequestOptions 中眨猎,可以擺脫冗長(zhǎng)的 Glide 加載語(yǔ)句,還能進(jìn)行自己的 API 封裝强经。RequestOptions 可以作為參數(shù)傳入到方法中睡陪。
RequestOptions options
= new RequestOptions()
.transforms()
.placeholder(R.drawable.place_holder)
.error(R.drawable.error)
// 可以指定加載圖片的大小,不讓 Glide 根據(jù)控件大小來(lái)決定圖片大小
.override(200,200)
// 加載原圖匿情,Glide 不會(huì)自動(dòng)壓縮兰迫,容易 OOM
.override(Target.SIZE_ORIGINAL)
// 緩存策略默認(rèn)開(kāi)啟,禁用方法
.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 分為內(nèi)存緩存和硬盤(pán)緩存炬称。
內(nèi)存緩存 主要作用是防止應(yīng)用重復(fù)將圖片數(shù)據(jù)讀取到內(nèi)存中汁果;
硬盤(pán)緩存 的只要作用是防止應(yīng)用重復(fù)中網(wǎng)絡(luò)或其他地方重復(fù)下載和讀取數(shù)據(jù)。
.diskCacheStrategy()方法可以接收五種參數(shù):
- DiskCacheStrategy.NONE:不緩存任何內(nèi)容
- DiskCacheStrategy.DATA: 只緩存原始圖片
- DiskCacheStrategy.RESOURCE: 只緩存轉(zhuǎn)換后的圖片
- DiskCacheStrategy.ALL:
- DiskCacheStrategy.AUTOMOTIC: 默認(rèn)選項(xiàng)玲躯,讓 Glide 根據(jù)圖片資源智能選擇使用哪種策略据德。
指定加載格式
Glide 可以自動(dòng)識(shí)別 gif 圖鳄乏,并展示。
如果指定格式需要調(diào)用 asBitmap() / asGif() 方法棘利。
Glide 4 中還增加了 asFile() / asDrawable()橱野,分別用于強(qiáng)指定文件格式和加載和 Drawable 格式的加載。
// Glide 4中 asXxx() 必須在 load() 前面善玫。
Glide.with(this).asXxx().load();
回調(diào)與監(jiān)聽(tīng)
1. into()
into() 參數(shù)可以指定為 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()
希望提前對(duì)圖片進(jìn)行一個(gè)預(yù)加載水援。有兩個(gè)方法重載。一個(gè)可以指定圖片大小茅郎。
// 圖片預(yù)加載
Glide.with(this)
.load("http://guolin.tech/book.png")
.preload();
// 預(yù)加載圖片的真正加載
Glide.with(this)
.load("http://guolin.tech/book.png")
.into(imageView);
3. submit()
用于下載圖片裹唆,不能預(yù)加載。關(guān)于圖片緩存的路徑只洒、訪(fǎng)問(wèn)獲取緩存文件的方法许帐。
對(duì)應(yīng) Glide 3 中的 downloadOnly()
submit() 可以替換 into()
也有兩個(gè)重載方法:
- submit()
- submit(int width, int height); // 指定大小
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://www.guolin.tech/book.png";
// 此處 context 使得 下載任務(wù)跟隨應(yīng)用的生命周期,防止 Activity 銷(xiāo)毀而任務(wù)被取消毕谴。
final Context context = getApplicationContext();
// submit 返回一個(gè) FutureTarget 對(duì)象成畦,進(jìn)行異步加載。
FutureTarget<File> target = Glide.with(context)
.asFile() // 指定加載格式
.load(url)
.submit();
// 如果圖片未加載完涝开,就會(huì)阻塞在 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()
用來(lái)監(jiān)聽(tīng) Glide 加載圖片的狀態(tài)循帐。
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 則 不會(huì)再回調(diào) Target 的 onResourceReady 方法 了舀武。
圖片變換 transforms()
對(duì)原始圖片進(jìn)行一些變換處理后展示給用戶(hù)拄养,包括 圓角化、圓形化银舱、黑白化瘪匿、模糊化 (高斯模糊) 等等
Github 上有個(gè)很好的庫(kù) glide-transformations
RequestOptions options = new RequestOptions()
.transforms(...);
// 有一些內(nèi)置的變換 API
.centerCrop() / .fitCenter() / .circleCrop()
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
高級(jí)技巧 - 自定義模塊
可以將 更改 Glide 配置,替換 Glide 組件等操作獨(dú)立出來(lái)寻馏∑迕郑可以對(duì) Glide 進(jìn)行自定義,并且和 Glide 的圖片加載邏輯沒(méi)有任何交集诚欠,也是一種低耦合編程方式的體現(xiàn)顽染。
首先,定義一個(gè)自己的模塊類(lèi)轰绵,extend APPGlideModule
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// TODO: 用來(lái)更改Glide配置
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
// TODO: 替換Glide組件
}
}