上周,我們已經看了你如何為你的 Glide 加載圖片而設置各種網絡棧。在內部,為網絡棧的 集成庫 甚至都不需要做其他的聲明,比如一個 `GlideModule`,它明顯的定制了一個 Glide 的行為。這篇博客中,我們會給你一個 `GlideModule` 的概述。
**Glide Modules?**
Glide module 是一個抽象方法,全局改變 Glide 行為的一個方式。如果你需要訪問 `GlideBuilder`,它要在你要做的地方創建 Glide 實例,這是要做的一種方法。為了定制 Glide,你需要去實現一個 [GlideModule](http://bumptech.github.io/glide/javadocs/latest/com/bumptech/glide/module/GlideModule.html) 接口的公共類。
~~~
public class SimpleGlideModule implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) {
// todo
}
@Override public void registerComponents(Context context, Glide glide) {
// todo
}
}
~~~
該接口提供了兩種發發來調整 Glide 不同的組件。在這篇博客中,我們主要看第一個方法 `applyOptions(Context context, GlideBuilder builder)`。
所以你知道要創建一個額外的類去定制 Glide。下一步是要全局的去聲明這個類,讓 Glide 知道它應該在哪里被加載和使用。Glide 會掃描` AndroidManifest.xml` 為 Glide module 的 meta 聲明。因此,你必須在 `AndroidManifest.xml` 的 `<application> `標簽內去聲明這個剛剛創建的 Glide module。
~~~
<manifest
...
<application>
<meta-data
android:name="io.futurestud.tutorials.glide.glidemodule.SimpleGlideModule"
android:value="GlideModule" />
...
</application>
</manifest>
~~~
請確保你將 `android:name` 屬性改成你的包名+類名的形式,這樣的引用才是正確的。就這樣,你不需要去添加其他任何代碼。如果你想刪掉 Glide Module,只需要把它從 `AndroidManifest.xml` 中移除就可以了。Java 類可以保存,說不定以后會用呢。如果它沒有在 `AndroidManifest.xml` 中被引用,那它不會被加載或被使用。
你去定制 module 的話 Glide 會有這樣一個優點:你可以同時聲明多個 Glide module。Glide 將會(沒有特定順序)得到所有的聲明 module。因為你當前不能定義順序,請確保定制不會引起沖突!
**GlideBuilder**?
好了,你知道如何用 Glide module 定制 Glide 了。現在來看看接口的第一個方法:`applyOptions(Context context, GlideBuilder builder)`。該方法給你了一個 `GlideBuilder` 對象作為變量。這個方法是一個 `void` 的返回類型,所以你可以在這個方法里去調 `GlideBuilder` 中可用的方法。
* `.setMemoryCache(MemoryCache memoryCache)`
* `.setBitmapPool(BitmapPool bitmapPool)`
* `.setDiskCache(DiskCache.Factory diskCacheFactory)`
* `.setDiskCacheService(ExecutorService service)`
* `.setResizeService(ExecutorService service)`
* `.setDecodeFormat(DecodeFormat decodeFormat)`
你可以看到,這個` GlideBuilder` 對象給你訪問了 Glide 重要的核心組件。在這個博客中使用的方法,你可以改變磁盤緩存,內存緩存等等!
我們稍后會看到更多進階的組件,但是現在我們先挑一個相對加單的改變:`.setDecodeFormat(DecodeFormat decodeFormat)。`
**使用實例:增加 Glide 的圖片質量**?
在 Android 中有兩個主要的方法對圖片進行解碼:ARGB8888 和 RGB565。前者為每個像素使用了 4 個字節,后者僅為每個像素使用了 2 個字節。ARGB8888 的優勢是圖像質量更高以及能存儲一個 alpha 通道。[Picasso](https://futurestud.io/blog/tag/picasso) 使用 ARGB8888,Glide 默認使用低質量的 RGB565。對于 Glide 使用者來說:你使用 Glide module 方法去改變解碼規則。
你只需要實現一個 `GlideModule`,像我們上面給你顯示的那樣,然后使用正確的枚舉值調用 `builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)`。
~~~
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 現在回用更高質量的圖片解碼。這種改變方式也遵循 Glide 的行為,適用于其他的模式。代碼在 `registerComponents()` 會看起來有一點不同,我們很快會看到的。
**Summary**?
這篇博客中,你已經學會了 Glide module 的基礎。你應該能感覺到他們是有用的,以及你知道怎么實現它們了。如果你仍然需要更多的信息,看看下面的資源鏈接。特別是如果你需要更多明確的在項目庫中如何去使用 Glide module 以及使用 ProGuard,避免混淆的情況,請去看看這些內容。
因為這是一個相當復雜的話題,我們將在下周通過一個實際的例子去實踐:如何用一個` GlideModule` 的 `registerComponents() `方法去從服務端使用 self-signed HTTPS 認證(這不是默認實現的)的方式去接收圖片。
資源?
[GlideModules on Glide’s Github](https://github.com/bumptech/glide/wiki/Configuration)
- 前言
- 一開始
- 二加載進階
- 三ListAdapter(ListView, GridView)
- 四占位符 和 漸現動畫
- 五圖片重設大小 和 縮放
- 六顯示 Gif 和 Video
- 七緩存基礎
- 八請求優先級
- 九縮略圖
- 十回調:SimpleTarget 和 ViewTarget 用于自定義視圖類
- 十一加載圖片到通知欄和應用小部件中
- 十二異常:調試和錯誤處理
- 十三自定義轉換
- 十四用 animate() 自定義動畫
- 十五集成網絡棧
- 十六用 Module 自定義
- 十七Module 實例:接受自簽名證書的 HTTPS
- 十八Module 實例:自定義緩存
- 十九Module 實例:用自定義尺寸優化加載的圖片
- 二十動態使用 Model Loader
- 二十一如何旋轉圖像
- 二十二系列綜述