Carson帶你學(xué)Android:圖片加載庫(kù)Glide使用教程


前言

  • 上文已經(jīng)對(duì)當(dāng)今Android主流的圖片加載庫(kù)進(jìn)行了全面介紹 & 對(duì)比

如果你還沒(méi)閱讀刊咳,我建議你先移步這里進(jìn)行查看

  • 今天我們來(lái)學(xué)習(xí)一下其中一個(gè)Android主流的圖片加載庫(kù)的使用 - Glide

Carson帶你學(xué)Android開(kāi)源庫(kù)系列文章:
Carson帶你學(xué)Android:主流開(kāi)源圖片加載庫(kù)對(duì)比(UIL娱挨、Picasso、Glide跷坝、Fresco)
Carson帶你學(xué)Android:主流開(kāi)源網(wǎng)絡(luò)請(qǐng)求庫(kù)對(duì)比(Volley酵镜、OkHttp柴钻、Retrofit)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求庫(kù)Retrofit使用教程
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求庫(kù)Retrofit源碼分析
Carson帶你學(xué)Android:圖片加載庫(kù)Glide使用教程
Carson帶你學(xué)Android:圖片加載庫(kù)Glide源碼分析
Carson帶你學(xué)Android:V-Layout,淘寶贴届、天貓都在用的UI框架,趕緊用起來(lái)吧毫蚓!


目錄

目錄

1. 簡(jiǎn)介

  • 介紹:Glide,是Android中一個(gè)圖片加載開(kāi)源庫(kù)

Google的開(kāi)源項(xiàng)目

  • 主要作用:實(shí)現(xiàn)圖片加載

2. 功能特點(diǎn)

2.1 功能列表

功能列表
  • 從上面可以看出元潘,Glide不僅實(shí)現(xiàn)了圖片異步加載的功能,還解決了Android中加載圖片時(shí)需要解決的一些常見(jiàn)問(wèn)題
  • 接下來(lái)柬批,我會(huì)對(duì)Glide的每個(gè)功能點(diǎn)進(jìn)行詳細(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類是核心實(shí)現(xiàn)類。
        Glide.with(context).load(Url).into(targetImageView);

//實(shí)現(xiàn)圖片加載功能至少需要三個(gè)參數(shù):
//with(Context context)
//Context對(duì)于很多Android API的調(diào)用都是必須的氮帐,這里就不多說(shuō)了

//load(String imageUrl):被加載圖像的Url地址。
//大多情況下上沐,一個(gè)字符串代表一個(gè)網(wǎng)絡(luò)圖片的URL。
                
//into(ImageView targetImageView):圖片最終要展示的地方参咙。
                
  • 設(shè)置加載尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
  • 設(shè)置加載中以及加載失敗圖片
    api里面對(duì)placeholder()、error()函數(shù)中有多態(tài)實(shí)現(xiàn)蕴侧,用的時(shí)候可以具體的熟悉一下
Glide
 .with(this)
  .load(imageUrl)
 .placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
  • 設(shè)置加載動(dòng)畫(huà)
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);

api也提供了幾個(gè)常用的動(dòng)畫(huà):比如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àng)目中有很多需要先下載圖片然后再做一些合成的功能,比如項(xiàng)目中出現(xiàn)的圖文混排净宵,該如何實(shí)現(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è)置縮略圖支持:先加載縮略圖 然后在加載全圖
                           //傳了一個(gè) 0.1f 作為參數(shù),Glide 將會(huì)顯示原始圖像的10%的大小敏储。
                          //如果原始圖像有 1000x1000 像素阻星,那么縮略圖將會(huì)有 100x100 像素妥箕。
        .asBitmap()//顯示gif靜態(tài)圖片 
        .asGif();//顯示gif動(dòng)態(tài)圖片
        .into(imageView)滥酥;

2.2.3 關(guān)于緩存

  • 設(shè)置磁盤(pán)緩存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);

// 緩存參數(shù)說(shuō)明
// DiskCacheStrategy.NONE:不緩存任何圖片矾踱,即禁用磁盤(pán)緩存
// DiskCacheStrategy.ALL :緩存原始圖片 & 轉(zhuǎn)換后的圖片(默認(rèn))
// DiskCacheStrategy.SOURCE:只緩存原始圖片(原來(lái)的全分辨率的圖像,即不緩存轉(zhuǎn)換后的圖片)
// DiskCacheStrategy.RESULT:只緩存轉(zhuǎn)換后的圖片(即最終的圖像:降低分辨率后 / 或者轉(zhuǎn)換后 呛讲,不緩存原始圖片
  • 設(shè)置跳過(guò)內(nèi)存緩存
Glide
  .with(this)
.load(imageUrl)
.skipMemoryCache(true)
.into(imageView);
//設(shè)置跳過(guò)內(nèi)存緩存
//這意味著 Glide 將不會(huì)把這張圖片放到內(nèi)存緩存中去
//這里需要明白的是,這只是會(huì)影響內(nèi)存緩存贝搁!Glide 將會(huì)仍然利用磁盤(pán)緩存來(lái)避免重復(fù)的網(wǎng)絡(luò)請(qǐng)求。
  • 清理緩存
Glide.get(this).clearDiskCache();//清理磁盤(pán)緩存 需要在子線程中執(zhí)行 
Glide.get(this).clearMemory();//清理內(nèi)存緩存 可以在UI主線程中進(jìn)行

2.2.4 其他設(shè)置

  • 生命周期集成
    通過(guò)設(shè)置綁定生命周期雷逆,我們可以更加高效的使用Glide提供的方式進(jìn)行綁定弦讽,這樣可以更好的讓加載圖片的請(qǐng)求的生命周期動(dòng)態(tài)管理起來(lái)
        .with(Context context)// 綁定Context
        .with(Activity activity);// 綁定Activity
        .with(FragmentActivity activity);// 綁定FragmentActivity
        .with(Fragment fragment);// 綁定Fragment

注意:

  1. 傳入的context類型影響到Glide加載圖片的優(yōu)化程度
  2. Glide可以監(jiān)視Activity的生命周期膀哲,在Activity銷毀的時(shí)候自動(dòng)取消等待中的請(qǐng)求。但是如果你使用Application context某宪,你就失去了這種優(yōu)化效果。
  • 設(shè)置動(dòng)態(tài)轉(zhuǎn)換
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
  • 設(shè)置下載優(yōu)先級(jí)
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);

3. Demo實(shí)例

沒(méi)有Demo的代碼講解不是好文章兴喂,讓我們來(lái)一步步學(xué)會(huì)使用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使用的前提衣迷,千萬(wàn)別忘了!:恕T平谩泼差!

步驟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);

還有具體其他功能需要配置的自己按照我上面寫(xiě)的進(jìn)行配置就好了~

這里再貼上Glide的Github地址:請(qǐng)點(diǎn)擊這里


4. 特點(diǎn)

4.1 優(yōu)點(diǎn)

  • 多樣化媒體加載
    Glide 不僅是一個(gè)圖片緩存,它支持 Gif、WebP滔灶、縮略圖普碎。甚至是 Video

  • 生命周期集成
    通過(guò)設(shè)置綁定生命周期录平,我們可以更加高效的使用Glide提供的方式進(jìn)行綁定缀皱,這樣可以更好的讓加載圖片的請(qǐng)求的生命周期動(dòng)態(tài)管理起來(lái)

  • 高效的緩存策略
    A. 支持Memory和Disk圖片緩存
    B. Picasso 只會(huì)緩存原始尺寸的圖片动猬,而 Glide 緩存的是多種規(guī)格,也就意味著 Glide 會(huì)根據(jù)你 ImageView 的大小來(lái)緩存相應(yīng)大小的圖片尺寸

比如你 ImageView 大小是200200赁咙,原圖是 400400 ,而使用 Glide 就會(huì)緩存 200200 規(guī)格的圖彼水,而 Picasso 只會(huì)緩存 400400 規(guī)格的崔拥。這個(gè)改進(jìn)就會(huì)導(dǎo)致 Glide 比 Picasso 加載的速度要快凤覆,畢竟少了每次裁剪重新渲染的過(guò)程,非常靈活 & 加載速度快

C. 內(nèi)存開(kāi)銷小
默認(rèn)的 Bitmap 格式是 RGB_565 格式盯桦,而 Picasso 默認(rèn)的是 ARGB_8888 格式,這個(gè)內(nèi)存開(kāi)銷要小一半拥峦。

Android關(guān)于圖片內(nèi)存計(jì)算,共有四種事镣,分別是:

  1. ALPHA_8:每個(gè)像素占用1byte內(nèi)存
  2. ARGB_4444:每個(gè)像素占用2byte內(nèi)存
  3. ARGB_8888:每個(gè)像素占用4byte內(nèi)存(默認(rèn)步鉴,色彩最細(xì)膩=顯示質(zhì)量最高=占用的內(nèi)存也最大)
  4. RGB_565:每個(gè)像素占用2byte內(nèi)存(8bit = 1byte)
    舉例說(shuō)明:一個(gè)32位的PNG=ARGB_8888=1204x1024,那么占用空間是:1024x1024x(32/8) = 4,194,304kb=4M左右
    在解析圖片的時(shí)候璃哟,為了避免oom和節(jié)省內(nèi)存,最好使用ARGB_4444模式(節(jié)省一半的內(nèi)存空間)

4.2 缺點(diǎn)

  • 使用方法復(fù)雜
    由于Glide其功能強(qiáng)大随闪,所以使用的方法非常多,其源碼也相對(duì)的復(fù)雜
  • 包較大

5. 相比其他圖片加載庫(kù)(Picasso & Fresco)

  • 對(duì)比Picasso
    Glide 是在Picasso 基礎(chǔ)之上進(jìn)行的二次開(kāi)發(fā)做了不少改進(jìn)铐伴,不過(guò)這也導(dǎo)致包比 Picasso 大不少,不過(guò)也就不到 500k(Picasso 是100多k)当宴,用法較為復(fù)雜畜吊,不過(guò)畢竟級(jí)別還是蠻小的户矢,影響不是很大
  • 對(duì)比Fresco
    使用較Fresco簡(jiǎn)單,但性能(加載速度 & 緩存)卻比不上Fresco

6. 應(yīng)用場(chǎng)景

根據(jù)Glide的特點(diǎn)和與其他圖片加載庫(kù)的對(duì)比,可以得出其使用場(chǎng)景:

  • 需要更多的內(nèi)容表現(xiàn)形式(如Gif)瓢娜;
  • 更高的性能要求(緩存 & 加載速度);

7. 總結(jié)

  • Glide使用起來(lái)是不是非常簡(jiǎn)單眠砾?相信你看完這篇文章后你能全面掌握Glide的用法
  • 但是Glide的源碼卻不簡(jiǎn)單,接下來(lái)我會(huì)對(duì)Glide的源碼進(jìn)行詳細(xì)分析托酸,感興趣的同學(xué)可以繼續(xù)關(guān)注Carson帶你學(xué)Android開(kāi)源庫(kù)系列文章:

Carson帶你學(xué)Android:主流開(kāi)源圖片加載庫(kù)對(duì)比(UIL、Picasso获高、Glide宣虾、Fresco)
Carson帶你學(xué)Android:主流開(kāi)源網(wǎng)絡(luò)請(qǐng)求庫(kù)對(duì)比(Volley、OkHttp、Retrofit)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求庫(kù)Retrofit使用教程
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求庫(kù)Retrofit源碼分析
Carson帶你學(xué)Android:圖片加載庫(kù)Glide使用教程
Carson帶你學(xué)Android:圖片加載庫(kù)Glide源碼分析
Carson帶你學(xué)Android:V-Layout燕锥,淘寶顽频、天貓都在用的UI框架,趕緊用起來(lái)吧砾层!


歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū)

不定期分享關(guān)于安卓開(kāi)發(fā)的干貨,追求短肛炮、平止吐、快侨糟,但卻不缺深度


請(qǐng)點(diǎn)贊秕重!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溶耘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凳兵,更是在濱河造成了極大的恐慌,老刑警劉巖庐扫,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜倦,死亡現(xiàn)場(chǎng)離奇詭異聚蝶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碘勉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)验靡,“玉大人,你說(shuō)我怎么就攤上這事胜嗓「咧埃” “怎么了辞州?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)埃元。 經(jīng)常有香客問(wèn)我,道長(zhǎng)岛杀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任崭孤,我火速辦了婚禮,結(jié)果婚禮上辨宠,老公的妹妹穿的比我還像新娘。我一直安慰自己彭羹,他們只是感情好黄伊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布还最。 她就那樣靜靜地躺著,像睡著了一般毡惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上经伙,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天勿锅,我揣著相機(jī)與錄音,去河邊找鬼溢十。 笑死,一個(gè)胖子當(dāng)著我的面吹牛达吞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酪劫,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼覆糟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起滩字,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踢械,沒(méi)想到半個(gè)月后酗电,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體内列,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年嫩与,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片交排。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埃篓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情架专,我是刑警寧澤同窘,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布想邦,位于F島的核電站,受9級(jí)特大地震影響委刘,放射性物質(zhì)發(fā)生泄漏鹰椒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一漆际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灿椅,春花似錦、人聲如沸钞支。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骨坑。三九已至,卻和暖如春欢唾,著一層夾襖步出監(jiān)牢的瞬間且警,已是汗流浹背礁遣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟霍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓沸呐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親崭添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寓娩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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