Android圖片加載框架之Glide

今天要學(xué)習(xí)的Glide框架和之前的Picasso有著高度相似性,先來感受一下:

Glide
  .with(myFragment)
  .load(url)
  .centerCrop()
  .placeholder(R.drawable.loading_spinner)
  .error(R.drawable.loading_error)
  .override(300, 300)
  .centerCrop()
  .crossFade()
  .into(myImageView);

和Picasso簡直不要太像

當(dāng)然Glide也有自己的特點,以下來簡單對比下和Picasso的異同:

  • 函數(shù)類似Picasso
  • Glide可以加載Gif
  • Glide有動畫
  • 緩存不一樣独令,Glide在磁盤上緩存的是小圖端朵,Picasso是原圖
  • 轉(zhuǎn)換圖片大小的函數(shù)不一樣,override()resize()
  • 方法數(shù)Picasso遠(yuǎn)遠(yuǎn)小于Glide

項目地址

https://github.com/bumptech/glide

使用方法

Gradle:

dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.android.support:support-v4:19.1.0'
}

和Picasso對比

  • with()方法
    Glide的with方法不光接受Context燃箭,還接受Activity 和 Fragment冲呢,圖片加載會和Activity/Fragment的生命周期保持一致,比如 Paused狀態(tài)在暫停加載招狸,在Resumed的時候又自動重新加載

  • 默認(rèn)Bitmap格式是RGB_565
    ARGB_8888可以展示最好的顏色屬性敬拓,每個圖片像素占據(jù)4個字節(jié)的大小,而RGB_565則表示每個圖片像素占據(jù)2個字節(jié)大小
    若對RGB_565效果不能接受裙戏,可以創(chuàng)建一個新的GlideModule將Bitmap格式轉(zhuǎn)換到ARGB_8888

public class GlideConfiguration implements GlideModule {
 
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }
 
    @Override
    public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}

同時在AndroidManifest.xml中將GlideModule定義為meta-data

<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration"
             android:value="GlideModule"/>
  • 自動計算ImageView大小并只加載該大小的圖片在內(nèi)存里
    當(dāng)然乘凸,Picasso可以使用.resize()或者當(dāng)ImageView為固定大小時使用.fit()來加載指定大小的圖片

  • 轉(zhuǎn)換后Image質(zhì)量比Picasso低
    Glide加載的圖片沒有Picasso那么平滑

  • 磁盤緩存策略

  • Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的
  • 平滑度的問題依然存在累榜,而且如果加載的是RGB565圖片营勤,那么緩存中的圖片也是RGB565
  • 它默認(rèn)會為每種大小的ImageView緩存 一次壹罚。盡管一張圖片已經(jīng)緩存了一次葛作,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載渔嚷,調(diào)整成新尺寸的大小,然后將這個尺寸的也緩存起來客年。不過量瓜,你可以改變這種行為,讓Glide既緩存全尺寸又緩存其他尺寸:
Glide.with(this)
     .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .into(ivImgGlide);

下次在任何ImageView中加載圖片的時候烫饼,全尺寸的圖片將從緩存中取出,重新調(diào)整大小比藻,然后緩存。而Picasso是每次從磁盤取出后都會調(diào)整一次大小慢叨,這會導(dǎo)致一些延遲


Glide可以做而Picasso 做不到的

  • 加載Gif動畫
    因為Glide和Activity/Fragment的生命周期是一致的,因此gif的動畫也會自動的隨著Activity/Fragment的狀態(tài)暫停赠尾、重放当窗。Glide 的緩存在gif這里也是一樣元咙,調(diào)整大小然后緩存。
    但Glide 動畫會消費太多的內(nèi)存。
  • 將本地視頻解碼成一張圖片
  • 配置圖片顯示的動畫
    相對的赶掖,Picasso只有一種動畫:fading in。
  • 使用thumbnail()產(chǎn)生一個你所加載圖片的thumbnail

加載Gif動畫

加載方式不多說了膳灶,和加載普通圖片一樣,這里要說的是兩個給力的特性

  • Gif檢查
Glide
    .with( context )
    .load( gifUrl )
    .asGif()
    .error( R.drawable.full_cake )
    .into( imageViewGif );

如果 gifUrl 是一個Gif,這沒什么變化霉晕。然而拄轻,不像之前那樣,如果這個 gifUrl 不是一個 Gif斧抱,Glide 將會把這個 load 當(dāng)成失敗處理,并顯示error占位圖宪郊。

  • Gif 轉(zhuǎn)為 Bitmap
Glide  
    .with( context )
    .load( gifUrl )
    .asBitmap()
    .into( imageViewGifAsBitmap );

即使gifUrl為Gif,也會將其作為bitmap來顯示

加載本地視頻

其實就是將本地視頻Uri作為參數(shù)傳入load(),Glide將截取視頻的一幀來顯示到ImageView里

緩存策略

  • 跳過內(nèi)存緩存
    .skipMemoryCache(true)
  • 磁盤緩存策略
    .diskCacheStrategy()有以下參數(shù):
    DiskCacheStrategy.NONE 什么都不緩存叹誉,就像剛討論的那樣
    DiskCacheStrategy.SOURCE 僅僅只緩存原來的全分辨率的圖像
    DiskCacheStrategy.RESULT 僅僅緩存最終的圖像,即蕉斜,降低分辨率后的(或者是轉(zhuǎn)換后的)
    DiskCacheStrategy.ALL 緩存所有版本的圖像(默認(rèn)行為

圖片請求優(yōu)先級

.priority()有以下參數(shù):
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE

縮略圖

.thumbnail(float value)

高階用法

偷個懶宅此,放上鏈接:
回調(diào):SimpleTarget 和 ViewTarget 用于自定義視圖類
加載圖片到通知欄和應(yīng)用小部件中
異常:調(diào)試和錯誤處理
自定義轉(zhuǎn)換
用 animate() 自定義動畫
集成網(wǎng)絡(luò)棧
用 Module 自定義 Glide
Module 實例:接受自簽名證書的 HTTPS
Module 實例:自定義緩存
Module 實例:用自定義尺寸優(yōu)化加載的圖片
動態(tài)使用 Model Loader
如何旋轉(zhuǎn)圖像
系列綜述


別人的經(jīng)驗

Glide和Picasso都是非常完美的庫璧亮。Glide加載圖像以及磁盤緩存的方式都要優(yōu)于Picasso帘饶,速度更快,并且Glide更有利于減少OutOfMemoryError的發(fā)生缴饭,GIF動畫是Glide的殺手锏。不過Picasso的圖片質(zhì)量更高峭火。

雖然我使用了很長時間的Picasso盏道,但是我得承認(rèn)現(xiàn)在我更喜歡Glide。我的建議是使用Glide朗伶,但是將Bitmap格式換成 ARGB_8888、讓Glide緩存同時緩存全尺寸和改變尺寸兩種。

參考鏈接
Google推薦的圖片加載庫Glide介紹
Glide — Getting Started
Glide - 開始粒督!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姐仅,更是在濱河造成了極大的恐慌,老刑警劉巖馒疹,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腥刹,居然都是意外死亡,警方通過查閱死者的電腦和手機垫卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門评抚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伯复,“玉大人鱼响,你說我怎么就攤上這事☆跷常” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵懂牧,是天一觀的道長。 經(jīng)常有香客問我躯保,道長澎语,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任歌溉,我火速辦了婚禮,結(jié)果婚禮上漫谷,老公的妹妹穿的比我還像新娘舔示。我一直安慰自己竖共,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布匣沼。 她就那樣靜靜地躺著倦沧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扑浸。 梳的紋絲不亂的頭發(fā)上指么,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天哩陕,我揣著相機與錄音,去河邊找鬼。 笑死鸳粉,一個胖子當(dāng)著我的面吹牛艰山,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挽唉,長吁一口氣:“原來是場噩夢啊……” “哼埂材!你這毒婦竟也來了首昔?” 一聲冷哼從身側(cè)響起预鬓,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滔吠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冬骚,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年贱呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了奄薇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驶俊,靈堂內(nèi)的尸體忽然破棺而出免姿,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布刚陡,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牢酵,春花似錦撑瞧、人聲如沸酬诀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒室。三九已至囤屹,卻和暖如春肃廓,著一層夾襖步出監(jiān)牢的瞬間铣鹏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工痰腮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巾钉,地道東北人阱高。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像寡夹,于是被迫代替她去往敵國和親菩掏。 傳聞我的和親對象是個殘疾皇子殴边,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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