Glide 使用簡(jiǎn)單總結(jié)(整理郭霖Glide系列文章)


文中內(nèi)容整理自郭霖Glide系列文章
郭霖 Glide


Glide 使用簡(jiǎn)單總結(jié)

基本使用

  • 基本使用
Glide.with(this)
     .load(url)
     .into(imageView);
  • 添加占位圖
Glide.with(this)
     .load(url)
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);
  • 強(qiáng)制轉(zhuǎn)換圖片格式(動(dòng)態(tài)gif圖與靜態(tài)bitmap)
// 強(qiáng)制靜態(tài)圖
Glide.with(this)
     .load(url)
     .asBitmap()
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);

// 強(qiáng)制動(dòng)態(tài)圖(注意如果不是動(dòng)態(tài)圖耸棒,會(huì)報(bào)錯(cuò),但是添加了error()方法之后可以捕獲)
Glide.with(this)
     .load(url)
     .asGif()
     .placeholder(本地圖片)
     .error(本地圖片)
     .into(imageView);
  • 指定圖片大小(使用override方法)
Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .override(100, 100) // 可以傳入Target.SIZE_ORIGINAL表示原始圖片大小
     .into(imageView);

緩存

  • 內(nèi)存緩存(默認(rèn)開(kāi)啟)
Glide.with(this)
     .load(url)
     .skipMemoryCache(true) // 傳入true則表示不使用內(nèi)存緩存
     .into(imageView);
  • 磁盤(pán)緩存(默認(rèn)使用的是DiskCacheStrategy.RESULT)

DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容媳叨。
DiskCacheStrategy.SOURCE: 表示只緩存原始圖片坝茎。
DiskCacheStrategy.RESULT: 表示只緩存轉(zhuǎn)換過(guò)后的圖片(默認(rèn)選項(xiàng))唠帝。
DiskCacheStrategy.ALL : 表示既緩存原始圖片雀摘,也緩存轉(zhuǎn)換過(guò)后的圖片赂鲤。

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

引申使用

緩存使用key來(lái)進(jìn)行本地緩存查找涯穷,有時(shí)候會(huì)有這樣的情況棍掐,地址在變,但是其實(shí)圖片還是同一個(gè)圖片求豫,例如七牛的圖片有時(shí)候可能會(huì)帶有一個(gè)token,像這樣http://url.com/image.jpg?token=d9caa6e02c990b0a塌衰, token可能會(huì)變诉稍,但是圖片還是同一個(gè)圖片蝠嘉,如果直接使用是無(wú)法使用緩存的。這個(gè)時(shí)候需要對(duì)glide的GlideUrl進(jìn)行一下改造杯巨。代碼如下:

public class MyGlideUrl extends GlideUrl {
    private String mUrl;
    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }
    /**
    * 關(guān)鍵就是這個(gè)getCacheKey, 在代碼里面將它的token給屏蔽掉即可蚤告,那么Glide在緩存時(shí)使
    * 用的key就是去掉token之后的key
    * /
    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }
    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }
}

使用如下:

Glide.with(this)
     .load(new MyGlideUrl(url))  // 在這里將url改為使用MyGlideUrl
     .into(imageView);

回調(diào)與監(jiān)聽(tīng)

  • Target

先看一下Target的繼承關(guān)系


Target 繼承關(guān)系

其中有兩個(gè)基本的Target

  1. SimpleTarget

單獨(dú)使用比較靈活,但是寫(xiě)成代碼有點(diǎn)難看

  1. ViewTarget

直接配合View寫(xiě)服爷,將它添加到自定義View的內(nèi)部杜恰,使用的時(shí)候簡(jiǎn)練

  • SimpleTarget使用(比較簡(jiǎn)單获诈,不多贅述)
// 此處的泛型可以是GlideDrawable或者Bitmap。
// 但是如果是Bitmap的話(huà)心褐,調(diào)用的時(shí)候就需要添加asBitmap()方法
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        // TODO 在此處做一些其他需要做的事情
        imageView.setImageDrawable(resource);
    }
};

public void loadImage() {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}
  • ViewTarget

用于配合View集成使用舔涎,直接寫(xiě)到View的內(nèi)部,其他和SimpleTarget差不多逗爹,只是寫(xiě)的位置不一樣

// 寫(xiě)一個(gè)自定義View
public class MyLayout extends LinearLayout {
    
    // 定義一個(gè)ViewTarget, 注意泛型
    private ViewTarget<MyLayout, GlideDrawable> viewTarget; 

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        // 創(chuàng)建并重寫(xiě)代碼亡嫌,其實(shí)和SimpleTarget是一樣的
        viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                MyLayout myLayout = getView();
                myLayout.setImageAsBackground(resource);
            }
        };
    }

    // 重要的是這個(gè)方法,使用Glide的時(shí)候需要調(diào)用這個(gè)方法來(lái)得到一個(gè)Target
    public ViewTarget<MyLayout, GlideDrawable> getTarget() {
        return viewTarget;
    }

    public void setImageAsBackground(GlideDrawable resource) {
        setBackground(resource);
    }
}

使用:

public void loadImage(MyLayout myLayout) {
        String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
        Glide.with(this)
             .load(url)
             .into(myLayout.getTarget()); // 就是這里調(diào)用
    }
  • preLoad

preLoad就是只加載掘而,不顯示挟冠,意思即可以先將圖片緩存下來(lái),在實(shí)際需要的時(shí)候再調(diào)用袍睡,那么就會(huì)從內(nèi)存或者磁盤(pán)里面進(jìn)行加載知染,這樣速度快

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE) // 配合使用SOURCE
     .preload();
Glide.with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                    boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model,
                    Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imageView);

圖片變換

  • 基本變換

默認(rèn)的圖片變換是fitCenter,可能直接使用override進(jìn)行大小指定斑胜,這樣圖片會(huì)按指定的大小進(jìn)行加載顯示控淡,也可以使用圖片變換,也可以?xún)蓚€(gè)同時(shí)使用

Glide.with(this)
     .load(url)
     .dontTransform() // 禁用變換
     .into(imageView);

Glide.with(this)
     .load(url)
     .transform(...) // 使用變換
     .into(imageView);

// 下面兩個(gè)只是對(duì)transform的一個(gè)封裝
Glide.with(this)
     .load(url)
     .centerCrop() // centerCrop
     .into(imageView);

Glide.with(this)
     .load(url)
     .fitCenter() // fitCenter
     .into(imageView);
  • 自定義變換

重寫(xiě)B(tài)itmapTransform類(lèi)(略)伪窖,調(diào)用時(shí)將重寫(xiě)的BitmapTransform加到transform方法里面

  • 使用變換庫(kù)

Github Glide 變換庫(kù)或者直接compile

dependencies {
    compile 'jp.wasabeef:glide-transformations:2.0.2'
}

可以多個(gè)同時(shí)使用

Glide.with(this)
     .load(url)
     .bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
     .into(imageView);

Glide的自定義模塊功能(略逸寓,參考郭霖 Glide 自定義模塊

  • 自定義配置,緩存策略等
  • 自定義組件覆山,請(qǐng)求框架等
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竹伸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子簇宽,更是在濱河造成了極大的恐慌勋篓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魏割,死亡現(xiàn)場(chǎng)離奇詭異譬嚣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钞它,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)拜银,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人遭垛,你說(shuō)我怎么就攤上這事尼桶。” “怎么了锯仪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵泵督,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庶喜,道長(zhǎng)小腊,這世上最難降的妖魔是什么救鲤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮秩冈,結(jié)果婚禮上本缠,老公的妹妹穿的比我還像新娘。我一直安慰自己入问,他們只是感情好搓茬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著队他,像睡著了一般卷仑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麸折,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天锡凝,我揣著相機(jī)與錄音,去河邊找鬼垢啼。 笑死窜锯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芭析。 我是一名探鬼主播锚扎,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馁启!你這毒婦竟也來(lái)了驾孔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惯疙,失蹤者是張志新(化名)和其女友劉穎翠勉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霉颠,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对碌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒿偎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朽们。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诉位,靈堂內(nèi)的尸體忽然破棺而出骑脱,到底是詐尸還是另有隱情,我是刑警寧澤不从,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布惜姐,位于F島的核電站犁跪,受9級(jí)特大地震影響椿息,放射性物質(zhì)發(fā)生泄漏歹袁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一寝优、第九天 我趴在偏房一處隱蔽的房頂上張望条舔。 院中可真熱鬧,春花似錦乏矾、人聲如沸孟抗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凄硼。三九已至,卻和暖如春捷沸,著一層夾襖步出監(jiān)牢的瞬間摊沉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工痒给, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留说墨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓苍柏,卻偏偏與公主長(zhǎng)得像尼斧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子试吁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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