Glide入門(mén)教程——16.用Modules定制Glide

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 系列概覽

  1. 入門(mén)簡(jiǎn)介
  2. 高級(jí)加載
  3. 適配器(ListView, GridView)
  4. 占位圖& 淡入淡出動(dòng)畫(huà)
  5. 圖片大小 & 縮放
  6. 播放GIF & 視頻
  7. 緩存基礎(chǔ)
  8. 請(qǐng)求優(yōu)先級(jí)
  9. 縮略圖
  10. 回調(diào):定制view中使用SimpleTarget和ViewTarget
  11. 通知欄和桌面小控件的圖片加載
  12. 異常: 調(diào)試和報(bào)錯(cuò)處理
  13. 自定義變換
  14. 用animate()定制動(dòng)畫(huà)
  15. 整合網(wǎng)絡(luò)協(xié)議棧
  16. 用Modules定制Glide
  17. Glide Module 案例: 接受自簽名HTTPS證書(shū)
  18. Glide Module 案例: 自定義緩存
  19. Glide Module 案例: 通過(guò)加載自定義大小圖片優(yōu)化
  20. 動(dòng)態(tài)使用 Model Loaders
  21. 如何旋轉(zhuǎn)圖片
  22. 系列綜述

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è)方法去解析圖片:ARGB8888RGB565。第一個(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的資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評(píng)論 25 708
  • 一、簡(jiǎn)介 在泰國(guó)舉行的谷歌開(kāi)發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫Glide的圖片加載庫(kù),作者是bumptech。這...
    天天大保建閱讀 7,593評(píng)論 2 28
  • 一、概述 前面說(shuō)的都是如何使用Glide提供的接口來(lái)展示圖片資源,今天這篇,我們來(lái)講一下如何改變Glide的配置。...
    澤毛閱讀 20,171評(píng)論 2 22
  • 我是一名即將畢業(yè)的大學(xué)生,同學(xué)們都在實(shí)習(xí),只有我在家準(zhǔn)備明年的公務(wù)員考試,其實(shí)心里有時(shí)是你寂寞的,習(xí)慣忙碌的生活,...
    我叫許前進(jìn)閱讀 509評(píng)論 0 1
  • 前一段把很多公眾號(hào)屏蔽了,因?yàn)闀?huì)發(fā)很多東西,使自己分心,可是現(xiàn)在還是不能完全靜下心來(lái),自己一直有一個(gè)目標(biāo),就是開(kāi)一...
    齊寶寶520閱讀 195評(píng)論 0 0