Glide — 用Modules定制Glide
原文:Customize Glide with Modules
作者:Norman Peitek
翻譯:Dexter0218
上篇文章,我們介紹了如何設(shè)置一些網(wǎng)絡(luò)協(xié)議棧去加載圖片。本質(zhì)上,集成網(wǎng)絡(luò)庫(kù)沒(méi)啥其他特殊的,就是定義一個(gè)GlideModule
來(lái)定制Glide的行為。這篇文章,我們會(huì)對(duì)Glide Modules
進(jìn)行概述。
Glide 系列概覽
- 入門(mén)簡(jiǎn)介
- 高級(jí)加載
- 適配器(ListView, GridView)
- 占位圖& 淡入淡出動(dòng)畫(huà)
- 圖片大小 & 縮放
- 播放GIF & 視頻
- 緩存基礎(chǔ)
- 請(qǐng)求優(yōu)先級(jí)
- 縮略圖
- 回調(diào):定制view中使用SimpleTarget和ViewTarget
- 通知欄和桌面小控件的圖片加載
- 異常: 調(diào)試和報(bào)錯(cuò)處理
- 自定義變換
- 用animate()定制動(dòng)畫(huà)
- 整合網(wǎng)絡(luò)協(xié)議棧
- 用Modules定制Glide
- Glide Module 案例: 接受自簽名HTTPS證書(shū)
- Glide Module 案例: 自定義緩存
- Glide Module 案例: 通過(guò)加載自定義大小圖片優(yōu)化
- 動(dòng)態(tài)使用 Model Loaders
- 如何旋轉(zhuǎn)圖片
- 系列綜述
Glide Modules
Glide modules是一個(gè)全局改變Glide行為的抽象的方式。你需要?jiǎng)?chuàng)建Glide的實(shí)例,來(lái)訪問(wèn)GlideBuilder。可以通過(guò)創(chuàng)建一個(gè)公共的類(lèi),實(shí)現(xiàn)GlideModule的接口來(lái)定制Glide:
public class SimpleGlideModule implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) {
// todo
}
@Override public void registerComponents(Context context, Glide glide) {
// todo
}
}
接口提供了兩個(gè)方法去調(diào)節(jié)Glide的不同部分,本文中,我們大部分內(nèi)容只研究第一個(gè)方法:applyOptions(Context context, GlideBuilder builder)
。
你已經(jīng)知道需要?jiǎng)?chuàng)建一個(gè)額外的類(lèi)去自定義Glide。下一步是要在全局中聲明這個(gè)類(lèi),這樣Glide知道它應(yīng)該加載并使用它。Glide會(huì)掃描AndroidManifest.xml
的Glide modules的meta
定義。這樣,你必須在AndroidManifest.xml
里的<application>
標(biāo)簽下聲明剛創(chuàng)建的Glide module。
<manifest
...
<application>
<meta-data
android:name="io.futurestud.tutorials.glide.glidemodule.SimpleGlideModule"
android:value="GlideModule" />
...
</application>
</manifest>
確保你設(shè)置android:name
為你自己的包名+類(lèi)名,這樣才能正確引用。你不需要添加其他的代碼到其中。如果你想要禁止Glide Module,只要從AndroidManifest.xml
里移除它。Java類(lèi)里的代碼可以留著供以后使用。當(dāng)在AndroidManifest.xml
里沒(méi)有引用的時(shí)候,它永遠(yuǎn)不會(huì)被加載。
Glide推薦實(shí)現(xiàn)自定義module的方式有一個(gè)好處:你可以一次同時(shí)聲明多個(gè)Glide Module。Glide會(huì)(沒(méi)有特殊的順序)都遍歷所有聲明的module。由于你當(dāng)前未定義順序,確保你的定制不會(huì)造成沖突!
GlideBuilder
你已經(jīng)知道如何使用Glide module去自定義Glide。現(xiàn)在我們看一下接口的第一個(gè)方法:applyOptions(Context context, GlideBuilder builder)
。這個(gè)方法將GlideBuilder
的對(duì)象當(dāng)作參數(shù),并且是void返回類(lèi)型,所以你在這個(gè)方法里能調(diào)用GlideBuilder
可以用的方法。
- .setMemoryCache(MemoryCache memoryCache)
- .setBitmapPool(BitmapPool bitmapPool)
- .setDiskCache(DiskCache.Factory diskCacheFactory)
- .setDiskCacheService(ExecutorService service)
- .setResizeService(ExecutorService service)
- .setDecodeFormat(DecodeFormat decodeFormat)
顯而易見(jiàn),GlideBuilder
對(duì)象可以讓你訪問(wèn)到Glide的核心部分。使用文中的方法,你可以改變磁盤(pán)緩存、內(nèi)存緩存等等。
我們以后會(huì)看更高級(jí)的部分,但現(xiàn)在我們選擇最簡(jiǎn)單的改變方式:.setDecodeFormat(DecodeFormat decodeFormat)
。
使用例子:提升Glide的圖片質(zhì)量
Android里有兩個(gè)方法去解析圖片:ARGB8888
和RGB565
。第一個(gè)為每個(gè)像素采用4 byte表示,后面一個(gè)則用2 byte表示。ARG8888
有更高的圖片質(zhì)量,并且能夠存儲(chǔ)一個(gè)alpha通道。當(dāng)Picasso使用ARGB888
時(shí),Glide默認(rèn)使用低質(zhì)量的RGB565
。Glide用戶(hù)的好消息:你可以通過(guò)使用Glide module方法改變解析格式。
你只要簡(jiǎn)單地實(shí)現(xiàn)一個(gè)GlideModule
,像之前提到的一樣,然后調(diào)用builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)
,并傳入正確的枚舉型參數(shù)。
public class SimpleGlideModule implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override public void registerComponents(Context context, Glide glide) {
// nothing to do here
}
}
如果你能正確地跟上我們的步驟,Glide現(xiàn)在可以使用更高質(zhì)量的圖片解析。另外一個(gè)方法改變Glide行為的方式也是一樣。代碼里的registerComponents()
會(huì)有點(diǎn)不一樣,以后介紹。
總結(jié)
本文中,你已經(jīng)學(xué)會(huì)了Glide module的基礎(chǔ)知識(shí)。你應(yīng)當(dāng)能夠感受到什么時(shí)候會(huì)有用,怎樣去實(shí)現(xiàn)它們。如果你仍然需要更多的信息。看看下面的資源鏈接。特別地,如果你需要更多關(guān)于在庫(kù)項(xiàng)目或者如何使用ProGuard等實(shí)現(xiàn)Glide module的說(shuō)明,確保再看看那里提供的內(nèi)容。
既然這是個(gè)非常復(fù)雜的內(nèi)容。后面的文章會(huì)介紹另一個(gè)實(shí)際的例子:如何在GlideModule里使用registerComponents()
去實(shí)現(xiàn)從自簽名HTTPS認(rèn)證的服務(wù)器獲取圖片。
資源
Github內(nèi)關(guān)于 Glide中的GlideModules的資源。