Glide 知識梳理(1) - 基本用法

一咬展、概述

本文的內(nèi)容大部分都是參考了下面這個鏈接中Glide分類的文章:

https://futurestud.io/tutorials/glide-getting-started

為了區(qū)分俏站,我們這篇只介紹一些基本用法土思,掌握這些基本就可以在項目中使用Glide了,而關(guān)于如何自定義Target/Glide Module等高級的用法屋灌,之后再進行討論。

二、導(dǎo)入依賴包&加載網(wǎng)絡(luò)靜態(tài)圖片

在使用前煤搜,首先需要在build.gradle中引入:

dependencies {
    //....
    compile 'com.github.bumptech.glide:glide:3.7.0'
    //...
}

下面是Glide加載一張網(wǎng)絡(luò)靜態(tài)圖片最基本的用法:

Glide
.with(this) //傳入關(guān)聯(lián)的Context,如果是Activity/Fragment唧席,那么它會根據(jù)組件當前的狀態(tài)來控制請求擦盾。
.load("http://i.imgur.com/DvpvklR.png") //需要加載的圖片嘲驾,大多數(shù)情況下就是網(wǎng)絡(luò)圖片的鏈接。
.into(getImageView()); //用來展現(xiàn)圖片的ImageView.

三迹卢、load的其它用法

在第二章的例子當中辽故,當我們調(diào)用完.with(Context context)之后,會返回一個RequestManager對象腐碱,之前我們就是調(diào)用它的load(String string)方法誊垢,除此之外,還提供了下面的這些load方法症见,load方法最終會返回一個DrawableTypeRequest<xxxx>喂走,而xxx就是我們傳入的參數(shù)的類型:

  • load(byte[] model),從byte[]中讀取
  • load(File file)筒饰,從File中讀取
  • load(Integer resourceId)缴啡,從resourceId中讀取
  • load(String string),從String當中讀取瓷们,這個一般對應(yīng)于網(wǎng)絡(luò)圖片的鏈接业栅,這個圖片有可能是普通的圖片,也可能是一個Gif谬晕,當我們需要展示一個Gif圖片時碘裕,只需要像加載普通圖片一樣就可以了,在加載完之后攒钳,這個Gif會被自動播放帮孔。
  • load(T model),從任意類型T的中讀取不撑,這個后面講到自定義Model時再介紹
  • load(Uri uri)文兢,從Uri類型中讀取,這個Uri必須能夠被UriLoader識別焕檬。
  • loadFromMediaStore(Uri uri)姆坚,從媒體設(shè)備的Uri中讀取,這個方法用來展示一個本地媒體視頻的縮略圖实愚,也就是視頻的第一幀兼呵,需要注意,這個鏈接只能是本地的腊敲,網(wǎng)絡(luò)上視頻鏈接地址是無效的击喂。

下面是各個方法加載的例子:

    //從byte[]中加載.
    public void loadByteArray(View view) {
        Bitmap sourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.book_local);
        ByteArrayOutputStream bArrayOS = new ByteArrayOutputStream();
        sourceBitmap.compress(Bitmap.CompressFormat.PNG, 100, bArrayOS);
        sourceBitmap.recycle();
        byte[] byteArray = bArrayOS.toByteArray();
        try {
            bArrayOS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Glide.with(this)
                .load(byteArray)
                .into(mImageView);
    }
    //從File中加載.
    public void loadFile(View view) {
        String storePath = "mnt/sdcard/book_local.jpg";
        File file = new File(storePath);
        Glide.with(this)
                .load(file)
                .into(mImageView);
    }
    //從resourceId中加載.
    public void loadResourceId(View view) {
        Glide.with(this)
                .load(R.drawable.book_local)
                .into(mImageView);
    }
    //從普通url中加載.
    public void loadNormalUrl(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .into(mImageView);
    }
    //從gif加載.
    public void loadGif(View view) {
        Glide.with(this)
                .load("http://s1.dwstatic.com/group1/M00/66/4D/d52ff9b0727dfd0133a52de627e39d2a.gif")
                .diskCacheStrategy(DiskCacheStrategy.SOURCE) //要加上這句,否則有可能會出現(xiàn)加載很慢碰辅,或者加載不出來的情況.
                .into(mImageView);
    }
    //從本地媒體視頻中加載.
    public void loadMedia(View view) {
        String storePath = "mnt/sdcard/media.mp4";
        File file = new File(storePath);
        Glide.with(this)
                .load(Uri.fromFile(file))
                .into(mImageView);
    }

四懂昂、占位圖片和錯誤圖片

4.1 顯示占位圖片

有時候由于網(wǎng)絡(luò)原因,導(dǎo)致請求耗時没宾,此時就需要在得到圖片資源之前凌彬,采用一個占位圖片潮尝,這樣就不會顯得界面太空,placeHolder就是做這個事的饿序,當我們調(diào)用了into方法之后,如果需要從網(wǎng)絡(luò)上獲取圖片羹蚣,那么它會先展示placeHolder設(shè)置的圖片原探,placeHolder除了支持傳入resourceId,還支持直接傳入一個Drawable對象顽素。

    @Override
    public DrawableRequestBuilder<ModelType> placeholder(int resourceId) {
        super.placeholder(resourceId);
        return this;
    }
    @Override
    public DrawableRequestBuilder<ModelType> placeholder(Drawable drawable) {
        super.placeholder(drawable);
        return this;
    }

使用placeHolder的例子:

    public void loadHolder(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .placeholder(R.drawable.book_placeholder)
                .into(mImageView);
    }

4.2 顯示錯誤圖片

有時候咽弦,當我們請求網(wǎng)絡(luò)圖片失敗時,我們希望給用戶一些提示胁出,這時候給它設(shè)置一些回調(diào)型型,并在回調(diào)當中進行處理。但是一般情況下全蝶,我們顯示一個表示錯誤的本地圖片就可以了闹蒜,為了和前面加載時的占位圖片區(qū)分,它提供了另一個error()方法抑淫,和placeHolder類似绷落,我們可以給它傳入一個resourceId或者Drawable對象。

    public void loadHolderError(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png") 
                .asGif()  //為了模擬加載失敗的情況.
                .placeholder(R.drawable.book_placeholder)
                .error(R.drawable.book_error)
                .into(mImageView);
    }

上面為了模擬失敗的情況始苇,我們傳入了一個png的鏈接砌烁,但是指定為加載asGif()資源。
我們發(fā)現(xiàn)它會先展示placeHolder的資源催式,再展示error的資源函喉。

4.3 定義圖片切換動畫

無論是placeHolder還是error,都會涉及到切換ImageView的圖片荣月,這時我們可以通過設(shè)置一個動畫來讓這個切換的過程顯得不那么突兀管呵,默認情況下動畫是開啟的,crossFade有下面這三個重載方法:

  • crossFade():采用默認動畫和默認時長喉童。
  • crossFade(int duration):采用默認動畫撇寞,自定義時長。
  • crossFade(int animationId, int duration):采用自定義動畫堂氯,并自定義時長蔑担。
    public void loadCustomCrossFade(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .placeholder(R.drawable.book_placeholder)
                .crossFade(5000) //改變的時長.
                .into(mImageView);
    }

4.4 關(guān)閉切換動畫

當然我們也可以通過dontAnimate,來關(guān)閉動畫咽白,這樣在切換的時候就不會出現(xiàn)動畫啤握。

    public void loadNoCrossFade(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .placeholder(R.drawable.book_placeholder)
                .dontAnimate()
                .into(mImageView);
    }

五、獲得圖片資源后晶框,進行裁剪

5.1 裁剪

Picasso相比排抬,Glide提供了一種更加高效的處理方式懂从,它會把內(nèi)存和緩存中的圖片限制到所展示的ImageView的返回內(nèi),Picasso也可以實現(xiàn)這一功能蹲蒲,但是需要調(diào)用fit()方法番甩。在使用Glide時,如果我們不希望它自動地去匹配ImageView的寬高届搁,那么可以調(diào)用override(width, height)缘薛,這樣圖片資源在被展示之前就會裁剪為指定的大小。

這個方法還有另一種場景卡睦,就是當我們確切的知道需要加載多大的圖片宴胧,但是此時ImageView的寬高并沒有得到。

5.2 定義裁剪的方式

因為有時候采用override直接裁剪圖片有可能導(dǎo)致只裁剪到了不必要的信息表锻,因此Glide還提供了兩個類似于ImageView中的scaleType屬性:

  • centerCrop:使原始的圖片的寬高按同等比例放大到override所指定的大小恕齐,并裁剪到多余的部分,這時最終的圖片資源的大小為(width, height)
  • fitCenter:使得原始圖片的寬高放大到小于等于override所指定的寬高瞬逊,因此显歧,我們最終得到圖片的大小有可能不為(width, height),也就是說不會撐滿整個ImageView确镊。
    下面是相關(guān)的代碼:
    public void loadOverride(View view) {
        Glide.with(this)
                .load(R.drawable.shader_pic)
                .override(20, 20)
                .into(mImageView);
    }

    public void loadOverrideCenterCrop(View view) {
        Glide.with(this)
                .load(R.drawable.shader_pic)
                .override(20, 20)
                .centerCrop()
                .into(mImageView);
    }

    public void loadOverrideFitCenter(View view) {
        Glide.with(this)
                .load(R.drawable.shader_pic)
                .override(20, 20)
                .fitCenter()
                .into(mImageView);
    }

5.3 和ImageViewscaleType的關(guān)系

由于ImageView的展示還需要受android:scaleType的影響追迟,這里情況有很多,所以上面裁剪出來骚腥,并不是說在ImageView里面展示就是20 * 20敦间,具體會出現(xiàn)的情況很多,這個之后再專門分析束铭。

六廓块、Gif圖片

在第二節(jié)中,我們簡單的介紹了如何用Glide展示Gif圖片的展示契沫,下面我們深入地討論一下其它兩點带猴。

5.1 asGif()

有時候,我們獲取的Gif圖片鏈接是服務(wù)器配置的懈万,因此我們無法知道這個鏈接到底是不是一個Gif圖片拴清。這時我們可以配置一個asGif()選項,這樣Glide就會知道我們是需要加載一個Gif圖片会通,當這個鏈接不是Gif時口予,加載就會失敗,如果我們定義了.error(xxx)涕侈,就會展示這個失敗的圖片沪停。
例如,下面這段代碼就會失敗:

    public void loadHolderError(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")  //傳入的是一個靜態(tài)圖片的鏈接.
                .asGif()  //為了模擬加載失敗的情況.
                .placeholder(R.drawable.book_placeholder)
                .error(R.drawable.book_error)
                .into(mImageView);
    }

5.2 asBitmap()

現(xiàn)在討論另外一種情況木张,在列表當中众辨,雖然我們獲得的是Gif鏈接,但是我們希望這時候不讓它播放舷礼,這時候就可以指定asBitmap()鹃彻,那么就只會展示Gif圖片的第一幀。

5.3 定義緩存

如果我們使用了.diskCacheStrategy(DiskCacheStrategy.SOURCE)妻献,那么Gif資源的加載將會更快浮声。

六、緩存策略

對于任何一個網(wǎng)絡(luò)圖片加載框架來說旋奢,緩存無疑是最關(guān)鍵的部分,Glide使用了內(nèi)存和磁盤緩存來避免不必要的網(wǎng)絡(luò)請求然痊,同時它也提供了一系列地接口讓使用者自定義緩存策略至朗。

6.1 內(nèi)存緩存策略

默認情況下,Glide會將圖片資源緩存到內(nèi)存當中剧浸。而如果使用了skipMemoryCache(true)锹引,Glide不會將這張圖片緩存到內(nèi)存當中。
有一點需要注意:如果之前對某個指向url的圖片使用了內(nèi)存緩存唆香,后面又用skipMemoryCache(true)聲明想讓同一個url不緩存到內(nèi)存中嫌变,那么是不會生效的。

6.2 磁盤緩存策略

當某個圖片變化很快時躬它,我們有可能不需要將它緩存到磁盤當中腾啥,我們可以采用diskCacheStrategy(int mode)來定義緩存的策略,Glide默認情況下既會緩存原始的圖片冯吓,也會緩存解析后的圖片倘待,舉個例子,假如服務(wù)器上的圖片是1000 * 1000组贺,而ImageView的大小只有500 * 500凸舵,默認情況下Glide會緩存這兩個版本的圖片,我們可以設(shè)定的磁盤緩存類型有下面四種:

  • DiskCacheStrategy.NONE:不緩存
  • DiskCacheStrategy.SOURCE:只緩存原始大小的圖片失尖,也就是1000 * 1000啊奄。
  • DiskCacheStrategy.RESULT:只緩存解析之后的圖片,也就是上面500 * 500的圖片掀潮,也就是說假如我們有兩個不同大小的ImageView菇夸,用他們加載同一個url的圖片,那么最終磁盤當中會有兩份不同大小的圖片資源仪吧。
  • DiskCacheStrategy.ALL:緩存所有版本的圖片峻仇。

現(xiàn)在我們介紹一下采用了DiskCacheStrategy.RESULT后的緩存文件名的命名策略,具體可以參考下面這篇文章:

https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

緩存文件的命名會依賴于四個部分:

  • DataFechergetId()方法的返回值邑商,一般情況下就是Data ModeltoString方法摄咆。對于傳入String類型的網(wǎng)絡(luò)鏈接而言凡蚜,就是url,而如果是File吭从,那么就是Filepath朝蜘。
  • 目標的寬高,如果定義了override(width, height)涩金,那就是指定的數(shù)值谱醇,默認情況下是TargetgetSize()方法,也就是ImageView的寬高步做。
  • 用來加載和緩存圖片的encodersdecoderstoString方法副渴。
  • 在加載時的可選簽名,這個方法在某些特殊的場景下很有用全度,例如加載的url沒有變煮剧,但是服務(wù)器上這個url對應(yīng)的圖片資源更新了,我們就可以通過.signature(xxx)來刷新緩存将鸵。

6.3 兩種策略的關(guān)系

上面我們討論了兩種緩存策略的定義勉盅,這兩種策略是相互獨立的,默認情況下內(nèi)存的緩存為打開顶掉,而磁盤的緩存策略為DiskCacheStrategy.ALL草娜。

七、請求優(yōu)先級

有時候痒筒,在同一個界面上我們會展示多個圖片宰闰,而為了用戶體驗,那么某個圖片我們希望先加載出來簿透,這時候就可以采用.priority(int priority)來定義請求的優(yōu)先級议蟆,當然,這些優(yōu)先級只是給Glide作為參考萎战,因為還涉及到圖片的大小咐容,服務(wù)器的響應(yīng)事件和網(wǎng)絡(luò)環(huán)境等因素,最后圖片展示的順序并不一定是根據(jù)優(yōu)先級來的蚂维,可選的優(yōu)先級包括:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE

八戳粒、縮略圖

前面,我們介紹了placeHolder虫啥,它可以指定一個本地資源蔚约,用來在網(wǎng)絡(luò)資源加載完成之前進行展示,而thumbnails則可以認為是一個動態(tài)的placeHolder涂籽,與placeHolder不同苹祟,我們可以給它指定一個網(wǎng)絡(luò)圖片鏈接。如果這個縮略圖請求在load請求之前返回那么,那么會先展示這個圖片树枫,等到load請求返回之后直焙,這個圖片就會消失。假如縮略圖的請求在load請求之后返回砂轻,那么請求結(jié)果會被丟棄掉奔誓。
Glide提供了兩種指定縮略圖的方式:

8.1 Simple Thumbnails

    public void loadScaleThumbnail(View view) {
        Glide.with(this)
                .load("http://i.imgur.com/DvpvklR.png")
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .thumbnail(0.1f)
                .into(mImageView);
    }

8.2 Complete Different Request

thumbnails還支持傳入一個Glide Request作為參數(shù),這個請求和原本的請求是相互獨立的搔涝,我們可以給它指定一個完全不同的url厨喂、緩存策略、大小等等庄呈。

    public void loadRequestThumbnail(View view) {
        DrawableRequestBuilder<String> thumbnailRequest = Glide
                .with(this)
                .load("http://i.imgur.com/DvpvklR.png");
        Glide.with(this)
                .load("http://s1.dwstatic.com/group1/M00/66/4D/d52ff9b0727dfd0133a52de627e39d2a.gif")
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .thumbnail(thumbnailRequest)
                .into(mImageView);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜕煌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诬留,更是在濱河造成了極大的恐慌斜纪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故响,死亡現(xiàn)場離奇詭異,居然都是意外死亡颁独,警方通過查閱死者的電腦和手機彩届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誓酒,“玉大人樟蠕,你說我怎么就攤上這事】扛蹋” “怎么了寨辩?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歼冰。 經(jīng)常有香客問我靡狞,道長,這世上最難降的妖魔是什么隔嫡? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任甸怕,我火速辦了婚禮,結(jié)果婚禮上腮恩,老公的妹妹穿的比我還像新娘梢杭。我一直安慰自己,他們只是感情好秸滴,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布武契。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咒唆。 梳的紋絲不亂的頭發(fā)上届垫,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音钧排,去河邊找鬼敦腔。 笑死,一個胖子當著我的面吹牛恨溜,可吹牛的內(nèi)容都是我干的符衔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼糟袁,長吁一口氣:“原來是場噩夢啊……” “哼判族!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起项戴,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤形帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后周叮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辩撑,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年仿耽,在試婚紗的時候發(fā)現(xiàn)自己被綠了合冀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡项贺,死狀恐怖君躺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情开缎,我是刑警寧澤棕叫,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奕删,受9級特大地震影響俺泣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜完残,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一砌滞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坏怪,春花似錦贝润、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽华畏。三九已至,卻和暖如春尊蚁,著一層夾襖步出監(jiān)牢的瞬間亡笑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工横朋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仑乌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓琴锭,卻偏偏與公主長得像晰甚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子决帖,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • 一厕九、簡介 在泰國舉行的谷歌開發(fā)者論壇上,谷歌為我們介紹了一個名叫Glide的圖片加載庫地回,作者是bumptech扁远。這...
    天天大保建閱讀 7,459評論 2 28
  • 作者簡介 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog 現(xiàn)在Android上的圖片加載框架非常...
    木木00閱讀 4,280評論 1 17
  • Glide是一款由Bump Technologies開發(fā)的圖片加載框架,使得我們可以在Android平臺上以極度簡...
    GB_speak閱讀 1,127評論 6 11
  • 段昆的場子被砸了刻像。 我?guī)е粟s到他那間酒吧的時候畅买,里面噼里啪啦的掌聲響成了一片,我心說段昆的心也太寬了细睡,場子剛讓人...
    同行十二年閱讀 470評論 2 2
  • HTML&CSS入門 標簽(空格分隔): html css [toc] 一谷羞、使用 css 控制頁面樣式的方式 二、...
    記憶的時間差閱讀 630評論 0 5