前言
- 上文已經(jīng)對當(dāng)今Android主流的圖片加載庫進行了全面介紹 & 對比
如果你還沒閱讀,我建議你先移步這里進行查看
- 今天我們來學(xué)習(xí)一下其中一個Android主流的圖片加載庫的使用 - Glide
Carson帶你學(xué)Android開源庫系列文章:
Carson帶你學(xué)Android:主流開源圖片加載庫對比(UIL、Picasso、Glide、Fresco)
Carson帶你學(xué)Android:主流開源網(wǎng)絡(luò)請求庫對比(Volley、OkHttp、Retrofit)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請求庫Retrofit使用教程
Carson帶你學(xué)Android:網(wǎng)絡(luò)請求庫Retrofit源碼分析
Carson帶你學(xué)Android:圖片加載庫Glide使用教程
Carson帶你學(xué)Android:圖片加載庫Glide源碼分析
Carson帶你學(xué)Android:V-Layout,淘寶、天貓都在用的UI框架,趕緊用起來吧!
目錄
1. 簡介
- 介紹:Glide,是Android中一個圖片加載開源庫
Google的開源項目
- 主要作用:實現(xiàn)圖片加載
2. 功能特點
2.1 功能列表
- 從上面可以看出,Glide不僅實現(xiàn)了圖片異步加載的功能,還解決了Android中加載圖片時需要解決的一些常見問題
- 接下來,我會對Glide的每個功能點進行詳細(xì)的介紹
2.2 功能介紹
2.2.1 關(guān)于圖片加載
- 圖片的異步加載(基礎(chǔ)功能)
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
String Url = "http://218.192.170.132/1.jpg";
//Glide使用了流式接口的調(diào)用方式
//Glide類是核心實現(xiàn)類。
Glide.with(context).load(Url).into(targetImageView);
//實現(xiàn)圖片加載功能至少需要三個參數(shù):
//with(Context context)
//Context對于很多Android API的調(diào)用都是必須的,這里就不多說了
//load(String imageUrl):被加載圖像的Url地址。
//大多情況下,一個字符串代表一個網(wǎng)絡(luò)圖片的URL。
//into(ImageView targetImageView):圖片最終要展示的地方。
- 設(shè)置加載尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
- 設(shè)置加載中以及加載失敗圖片
api里面對placeholder()、error()函數(shù)中有多態(tài)實現(xiàn),用的時候可以具體的熟悉一下
Glide
.with(this)
.load(imageUrl)
.placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
- 設(shè)置加載動畫
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
api也提供了幾個常用的動畫:比如crossFade()
R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
- 設(shè)置要加載的內(nèi)容
項目中有很多需要先下載圖片然后再做一些合成的功能,比如項目中出現(xiàn)的圖文混排,該如何實現(xiàn)目標(biāo)下
Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
imageView.setImageDrawable(resource);
}
});
2.2.2 多樣式的媒體加載
Glide
.with(context)
.load(imageUrl);
.thumbnail(0.1f);//設(shè)置縮略圖支持:先加載縮略圖 然后在加載全圖
//傳了一個 0.1f 作為參數(shù),Glide 將會顯示原始圖像的10%的大小。
//如果原始圖像有 1000x1000 像素,那么縮略圖將會有 100x100 像素。
.asBitmap()//顯示gif靜態(tài)圖片
.asGif();//顯示gif動態(tài)圖片
.into(imageView);
2.2.3 關(guān)于緩存
- 設(shè)置磁盤緩存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
// 緩存參數(shù)說明
// DiskCacheStrategy.NONE:不緩存任何圖片,即禁用磁盤緩存
// DiskCacheStrategy.ALL :緩存原始圖片 & 轉(zhuǎn)換后的圖片(默認(rèn))
// DiskCacheStrategy.SOURCE:只緩存原始圖片(原來的全分辨率的圖像,即不緩存轉(zhuǎn)換后的圖片)
// DiskCacheStrategy.RESULT:只緩存轉(zhuǎn)換后的圖片(即最終的圖像:降低分辨率后 / 或者轉(zhuǎn)換后 ,不緩存原始圖片
- 設(shè)置跳過內(nèi)存緩存
Glide
.with(this)
.load(imageUrl)
.skipMemoryCache(true)
.into(imageView);
//設(shè)置跳過內(nèi)存緩存
//這意味著 Glide 將不會把這張圖片放到內(nèi)存緩存中去
//這里需要明白的是,這只是會影響內(nèi)存緩存!Glide 將會仍然利用磁盤緩存來避免重復(fù)的網(wǎng)絡(luò)請求。
- 清理緩存
Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執(zhí)行
Glide.get(this).clearMemory();//清理內(nèi)存緩存 可以在UI主線程中進行
2.2.4 其他設(shè)置
- 生命周期集成
通過設(shè)置綁定生命周期,我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態(tài)管理起來
.with(Context context)// 綁定Context
.with(Activity activity);// 綁定Activity
.with(FragmentActivity activity);// 綁定FragmentActivity
.with(Fragment fragment);// 綁定Fragment
注意:
- 傳入的context類型影響到Glide加載圖片的優(yōu)化程度
- Glide可以監(jiān)視Activity的生命周期,在Activity銷毀的時候自動取消等待中的請求。但是如果你使用Application context,你就失去了這種優(yōu)化效果。
- 設(shè)置動態(tài)轉(zhuǎn)換
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
- 設(shè)置下載優(yōu)先級
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
3. Demo實例
沒有Demo的代碼講解不是好文章,讓我們來一步步學(xué)會使用Glide。
步驟1:在gradle添加依賴
compile 'com.github.bumptech.glide:glide:3.7.0'
步驟2:添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
步驟1和步驟2是Glide使用的前提,千萬別忘了!!!!
步驟3:在MainActivity中
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
String Url = "http://218.192.170.132/1.jpg";
Glide
.with(this)
.load(Url)
.into(targetImageView);
還有具體其他功能需要配置的自己按照我上面寫的進行配置就好了~
這里再貼上Glide的Github地址:請點擊這里
4. 特點
4.1 優(yōu)點
多樣化媒體加載
Glide 不僅是一個圖片緩存,它支持 Gif、WebP、縮略圖。甚至是 Video生命周期集成
通過設(shè)置綁定生命周期,我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態(tài)管理起來高效的緩存策略
A. 支持Memory和Disk圖片緩存
B. Picasso 只會緩存原始尺寸的圖片,而 Glide 緩存的是多種規(guī)格,也就意味著 Glide 會根據(jù)你 ImageView 的大小來緩存相應(yīng)大小的圖片尺寸
比如你 ImageView 大小是200200,原圖是 400400 ,而使用 Glide 就會緩存 200200 規(guī)格的圖,而 Picasso 只會緩存 400400 規(guī)格的。這個改進就會導(dǎo)致 Glide 比 Picasso 加載的速度要快,畢竟少了每次裁剪重新渲染的過程,非常靈活 & 加載速度快
C. 內(nèi)存開銷小
默認(rèn)的 Bitmap 格式是 RGB_565 格式,而 Picasso 默認(rèn)的是 ARGB_8888 格式,這個內(nèi)存開銷要小一半。
Android關(guān)于圖片內(nèi)存計算,共有四種,分別是:
- ALPHA_8:每個像素占用1byte內(nèi)存
- ARGB_4444:每個像素占用2byte內(nèi)存
- ARGB_8888:每個像素占用4byte內(nèi)存(默認(rèn),色彩最細(xì)膩=顯示質(zhì)量最高=占用的內(nèi)存也最大)
- RGB_565:每個像素占用2byte內(nèi)存(8bit = 1byte)
舉例說明:一個32位的PNG=ARGB_8888=1204x1024,那么占用空間是:1024x1024x(32/8) = 4,194,304kb=4M左右
在解析圖片的時候,為了避免oom和節(jié)省內(nèi)存,最好使用ARGB_4444模式(節(jié)省一半的內(nèi)存空間)
4.2 缺點
- 使用方法復(fù)雜
由于Glide其功能強大,所以使用的方法非常多,其源碼也相對的復(fù)雜 - 包較大
5. 相比其他圖片加載庫(Picasso & Fresco)
- 對比Picasso
Glide 是在Picasso 基礎(chǔ)之上進行的二次開發(fā)做了不少改進,不過這也導(dǎo)致包比 Picasso 大不少,不過也就不到 500k(Picasso 是100多k),用法較為復(fù)雜,不過畢竟級別還是蠻小的,影響不是很大 - 對比Fresco
使用較Fresco簡單,但性能(加載速度 & 緩存)卻比不上Fresco
6. 應(yīng)用場景
根據(jù)Glide的特點和與其他圖片加載庫的對比,可以得出其使用場景:
- 需要更多的內(nèi)容表現(xiàn)形式(如Gif);
- 更高的性能要求(緩存 & 加載速度);
7. 總結(jié)
- Glide使用起來是不是非常簡單?相信你看完這篇文章后你能全面掌握Glide的用法
- 但是Glide的源碼卻不簡單,接下來我會對Glide的源碼進行詳細(xì)分析,感興趣的同學(xué)可以繼續(xù)關(guān)注Carson帶你學(xué)Android開源庫系列文章:
Carson帶你學(xué)Android:主流開源圖片加載庫對比(UIL、Picasso、Glide、Fresco)
Carson帶你學(xué)Android:主流開源網(wǎng)絡(luò)請求庫對比(Volley、OkHttp、Retrofit)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請求庫Retrofit使用教程
Carson帶你學(xué)Android:網(wǎng)絡(luò)請求庫Retrofit源碼分析
Carson帶你學(xué)Android:圖片加載庫Glide使用教程
Carson帶你學(xué)Android:圖片加載庫Glide源碼分析
Carson帶你學(xué)Android:V-Layout,淘寶、天貓都在用的UI框架,趕緊用起來吧!
歡迎關(guān)注Carson_Ho的簡書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度。