今天要學(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 - 開始粒督!