Glide 使用

文章都是參考郭霖的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組件
    } 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粉寞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子左腔,更是在濱河造成了極大的恐慌唧垦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔悠,死亡現(xiàn)場(chǎng)離奇詭異业崖,居然都是意外死亡野芒,警方通過(guò)查閱死者的電腦和手機(jī)蓄愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)双炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撮抓,你說(shuō)我怎么就攤上這事妇斤。” “怎么了丹拯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵站超,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乖酬,道長(zhǎng)死相,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任咬像,我火速辦了婚禮算撮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘县昂。我一直安慰自己肮柜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布倒彰。 她就那樣靜靜地躺著审洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待讳。 梳的紋絲不亂的頭發(fā)上芒澜,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音创淡,去河邊找鬼撰糠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辩昆,可吹牛的內(nèi)容都是我干的阅酪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汁针,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼术辐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起施无,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辉词,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后猾骡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瑞躺,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敷搪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幢哨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赡勘。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捞镰,靈堂內(nèi)的尸體忽然破棺而出闸与,到底是詐尸還是另有隱情,我是刑警寧澤岸售,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布践樱,位于F島的核電站,受9級(jí)特大地震影響凸丸,放射性物質(zhì)發(fā)生泄漏拷邢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一屎慢、第九天 我趴在偏房一處隱蔽的房頂上張望瞭稼。 院中可真熱鬧,春花似錦抛人、人聲如沸弛姜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)廷臼。三九已至,卻和暖如春绝页,著一層夾襖步出監(jiān)牢的瞬間荠商,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工续誉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莱没,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓酷鸦,卻偏偏與公主長(zhǎng)得像饰躲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臼隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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