Glide學(xué)習(xí)筆記

來自于 Glide - 開始擅威!

1、依賴:

compile 'com.github.bumptech.glide:glide:3.6.0'

2冈钦、基本使用:

    Glide.with(context) //參數(shù)Activity/Fragment
                        //設(shè)置路徑
                        .load(circleItem.getPics())
                        //緩存策略郊丛,緩存最終圖片
                        .diskCacheStrategy(DiskCacheStrategy.RESULT)
                        //占位圖
                        .error(R.drawable.ic_default_img).placeholder(R.drawable.ic_default_img)
                        //動畫
                        .crossFade()
                        //調(diào)整圖片像素大小
                        .override(320,  320)
                        //目標(biāo)圖片進(jìn)行裁剪
                        .fitCenter().into(((ItemViewHolder) holder).img);

其中幾個方法:

1、CenterCrop()和fitCenter()
分別對應(yīng)ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER瞧筛。

  • CenterCrop():會縮放圖片讓圖片充滿整個ImageView的邊框厉熟,然后裁掉超出的部分。ImageVIew會被完全填充滿较幌,但是圖片可能不能完全顯示出揍瑟。
  • fitCenter():會縮放圖片讓兩邊都相等或小于ImageView的所需求的邊框。圖片會被完整顯示乍炉,可能不能完全填充整個ImageView绢片。

2滤馍、硬盤緩存diskCacheStrategy():

  • DiskCacheStrategy.NONE 什么都不緩存
  • DiskCacheStrategy.SOURCE 僅僅只緩存原來的全分辨率的圖像
  • DiskCacheStrategy.RESULT 僅僅緩存最終的圖像(轉(zhuǎn)換后的)
  • DiskCacheStrategy.ALL 緩存所有版本的圖像(默認(rèn)行為)

如果已經(jīng)緩存過全尺寸圖片,則根據(jù)全尺寸圖片進(jìn)行調(diào)整底循,不用重新下載了

3巢株、override
如果沒有為圖片指定尺寸(override),默認(rèn)會以View的大小去限制圖片的大小

3此叠、特點(diǎn):

  • Glide支持遠(yuǎn)程圖片/本地圖片的獲取纯续、大小調(diào)整和展示
    參考:使用Glide加載圖片系列之一從不同的數(shù)據(jù)源加載圖片
  • 圖片加載會和Activity/Fragment的生命周期保持一致,如paused狀態(tài)暫停加載灭袁,resumed狀態(tài)又自動重新加載
  • 支持GIF:Glide.with(context).load(““):GIF動畫圖片可以自動顯示為動畫效果
  • 加載靜態(tài)圖片:Glide.with(context).load(“圖片路徑“).asBitmap()猬错,如果是gif,僅僅顯示第一幀茸歧。
  • 加載gif:Glide.with(context).load(“圖片路徑“).asGif()倦炒,如果不是gif,會被當(dāng)作error處理软瞎。
  • 如果相關(guān)的item已經(jīng)滾出了屏幕的范圍逢唤,Glide會自動取消超出屏幕的圖片請求。Glide是通過在ImageView上設(shè)置一個tag涤浇,在加載另外一張圖片之前檢查這個tag鳖藕,如果存在就取消第一次請求。
  • 內(nèi)存緩存 更小的圖片 : Glide 以 url只锭、viewwidth著恩、viewheight、屏幕的分辨率等做為聯(lián)合 key蜻展,將處理后的圖片緩存在內(nèi)存緩存中喉誊,而不是原始圖片以節(jié)省大小

4、一些方法

1纵顾、關(guān)于downloadOnly伍茄、preload

  • downloadOnly方法
    downloadOnly不是用來重置圖片大小的,即便設(shè)置了大小施逾,也只會預(yù)緩存原始圖像敷矫,不會緩存“結(jié)果”圖像;參數(shù)通常為Target.SIZE_ORIGINAL汉额,如下:
Glide.with(this).load(url)
        .downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL);
  • preload
    如果想要預(yù)緩存圖片沪饺,可以使用preload,注意前后的transformation(fitCenter)和size必須一致
Glide.with(this).load(url)
        .diskCacheStrategy(DiskCacheStrategy.RESULT).fitCenter()
        .preload(260,260);

downloadOnly僅僅進(jìn)行硬盤緩存(緩存SOURCE)闷愤,preload進(jìn)行硬盤和內(nèi)存緩存

downloadOnly、preload

參考:Difference between downloadOnly() and preload()件余、Is that downloadOnly not cache the image?

2讥脐、 Glide 中的回調(diào):Targets
Glide 提供了各種的 targets 遭居,可以在 Glide 做完網(wǎng)絡(luò)請求和處理之后,在這里得到返回的結(jié)果旬渠。

  • SimpleTarget
    只是想通過Glide加載一個Bitmap而不是把它顯示到View中
    private SimpleTarget<Bitmap> simpleTarget=new SimpleTarget<Bitmap>(200,200) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        }
    };
  • ViewTarget:
    通過Glide加載圖片到對應(yīng)的View中俱萍, 默認(rèn)不支持加載圖片到非ImageView 中,但是可以通過繼承 ViewTarget 和其子類實現(xiàn)告丢。
    • ViewTarget<T,Z>
    • ImageViewTarget<Z>
      • BitmapImageViewTarget:使用asBitmap()進(jìn)行加載的默認(rèn)目標(biāo)
      • DrawableImageViewTarget
      • GlideDrawableImageViewTarget:正常加載和使用asGif()進(jìn)行加載的默認(rèn)目標(biāo).

加載圖片到RelativeLayout中

    private ViewTarget<RelativeLayout, GlideDrawable> viewTarget=new ViewTarget<RelativeLayout, GlideDrawable>(bgContainer) {
        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
            this.view.setBackground(resource.getCurrent());
        }
    };
    Glide.with(getActivity()).load(R.drawable.ic_main_bg).diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(viewTarget);

注意:
1枪蘑、在into()方法中,不要使用匿名內(nèi)部類:在 Glide 做完圖片請求之前岖免, Android 垃圾很可能會回收這個匿名內(nèi)部類對象岳颇,最終這可能會導(dǎo)致,當(dāng)圖像加載完成了颅湘,但是回調(diào)再也不會被調(diào)用话侧。
2、使用SimpleTarget<Bitmap>時闯参,需要為target指定一個尺寸

參考: Glide之Target

3瞻鹏、用 GlideModule自定義 Glide

  • 實現(xiàn)GlideModule接口,全局改變 Glide 行為
public class ConfigurationGlide implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 設(shè)置別的get/set tag id鹿寨,以免占用View默認(rèn)的新博,Glide的3.6.0可以
        ViewTarget.setTagId(R.id.glide_tag_id);

        /*
        內(nèi)存緩存
        Glide提供了一個類MemorySizeCalculator,用于決定內(nèi)存緩存大小以及 bitmap 的緩存池脚草。
        bitmap 池維護(hù)了你 App 的堆中的圖像分配赫悄。
        正確的 bitmpa 池是非常必要的,因為它避免很多的圖像重復(fù)回收玩讳,這樣可以確保垃圾回收器的管理更加合理涩蜘。
        它的默認(rèn)計算實現(xiàn)
        */
        MemorySizeCalculator memorySizeCalculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();
        builder.setMemoryCache(new LruResourceCache((int) (defaultMemoryCacheSize*1.2f)));
        builder.setBitmapPool(new LruBitmapPool((int) (defaultBitmapPoolSize * 1.2f)));

        /*
        磁盤緩存
        Glide圖片緩存有兩種情況,一種是內(nèi)部磁盤緩存另一種是外部磁盤緩存熏纯。
        我們可以通過 builder.setDiskCache()設(shè)置同诫,并且Glide已經(jīng)封裝好了兩個類實現(xiàn)外部和內(nèi)部磁盤緩存,
        分別是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory
         */
        //磁盤緩存100M樟澜,默認(rèn)250M
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,100*1024*1024));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

磁盤緩存可以位于應(yīng)用的私有目錄(除了它自己误窖,沒有別的應(yīng)用可以訪問),也可以位于外部存儲,不能一起設(shè)置這兩個

  • 聲明:Glide 會掃描 AndroidManifest.xml 為 GlideModule 的 meta 聲明秩贰。
<meta-data android:name="com.hqgj.shareimgtransition.common.ConfigurationGlide" android:value="GlideModule"/>

參考: android學(xué)習(xí)之路(一)--Glide學(xué)習(xí)

盡量不要使用太大的圖片霹俺,一般頁面上圖片顯示多大就把圖片設(shè)置成多大,如果是后臺上傳的圖片毒费,可以使用組件把圖片生成縮略圖丙唧,如ASPJPEG上傳組件。

4觅玻、為不同的分辨率設(shè)備想际,加載不同尺寸的圖片

需要使用我們自己的ModeLoader(.using(new MyUrlLoader(this)))培漏,加載自己的數(shù)據(jù)源(.load(T model)),如下:

    Glide.with(this).using(new MutImgUrlLoader(this))
            .load(new MutImgDataModel() {
                @Override
                public String buildUrl(int width, int height) {
                    if(width>=1440){
                        return result.getImg()+ ThumbnailUtil.IMG1440;
                    }else if(width>=1080){
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }else if(width>=720){
                        return result.getImg()+ThumbnailUtil.IMG720;
                    }else if(width>=480){
                        return result.getImg()+ThumbnailUtil.IMG480;
                    }else {
                        return result.getImg()+ThumbnailUtil.IMG1080;
                    }
                }
            })
            .asBitmap()
            .transform(new GlideCircleTransform(this))
            .error(R.mipmap.ic_launcher)
            .animate(animator)
            .into(new BitmapImageViewTarget(imageView){
                @Override
                protected void setResource(Bitmap resource) {
                    super.setResource(resource);
                }
            });

實現(xiàn)自定義的ModelLoader胡本,繼承BaseGlideUrlLoader牌柄。

public class MutImgUrlLoader extends BaseGlideUrlLoader<MutImgDataModel> {
    public MutImgUrlLoader(Context context) {
        super(context);
    }
    @Override
    protected String getUrl(MutImgDataModel model, int width, int height) {
        return model.buildUrl(width,height);
    }
}

自定義數(shù)據(jù)源:

public interface MutImgDataModel {
    public String buildUrl(int width, int height);
}

這樣,我們在高分率的設(shè)備上加載大圖的url1侧甫,在低分辨率的設(shè)備上加載小圖url2珊佣。從而實現(xiàn)了根據(jù)不同手機(jī)上的像素值大小加載不同尺寸的圖片的需求。

參考:使用Glide加載圖片系列之一從不同的數(shù)據(jù)源加載圖片

5披粟、集成網(wǎng)絡(luò)庫
用 Glide 集成一個網(wǎng)絡(luò)庫咒锻,需要一個 Glide 的 ModeLoader 的接口。為了讓你更加易用僻爽,Glide 為2個網(wǎng)絡(luò)庫提供了實現(xiàn): OkHttp 和 Volley 虫碉。
Volley

dependencies {
  ...
  // Glide
  compile 'com.github.bumptech.glide:glide:3.6.1'
  // Glide's Volley Integration
  compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
  compile 'com.mcxiaoke.volley:library:1.0.8'
}

這將添加 Volley 并集成該庫到你的項目中。集成庫添加GlideModule 到你的 Android.Manifest 胸梆。Glide 會自動認(rèn)出它敦捧,然后使用 Volley 作為網(wǎng)絡(luò)庫。并不要求做其他的配置碰镜!

參考:Glide - 集成網(wǎng)絡(luò)棧

6兢卵、取消緩存
取消內(nèi)存緩存(在主線程中調(diào)用)

Glide.get(this).clearMemory();

7、在listview中加載高度不固定圖片绪颖,加載刷新圖片跳動解決秽荤?
為啥高度不固定的時候會閃爍呢,應(yīng)該跟圖片高度不同有關(guān)柠横,在更新listview時候窃款,會去重新計算listview高度,繪制item牍氛,不同高度圖片會重新計算.

8晨继、-實現(xiàn)滾動加載,不滾動時不加載
Glide.with(context).resumeRequests()/Glide.with(context).pauseRequests()

參考:
Android圖片庫--Glide Wiki中文翻譯搬俊、圖片加載框架Glide解析紊扬、對比Picasso內(nèi)存占用Yelp app是如何使用Glide優(yōu)化圖片加載的唉擂、Glide的使用大法與內(nèi)傷治療方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末餐屎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玩祟,更是在濱河造成了極大的恐慌腹缩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藏鹊,居然都是意外死亡胜臊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門伙判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黑忱,你說我怎么就攤上這事宴抚。” “怎么了甫煞?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵菇曲,是天一觀的道長。 經(jīng)常有香客問我抚吠,道長常潮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任楷力,我火速辦了婚禮喊式,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萧朝。我一直安慰自己岔留,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布检柬。 她就那樣靜靜地躺著献联,像睡著了一般。 火紅的嫁衣襯著肌膚如雪何址。 梳的紋絲不亂的頭發(fā)上里逆,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音用爪,去河邊找鬼原押。 笑死,一個胖子當(dāng)著我的面吹牛项钮,可吹牛的內(nèi)容都是我干的班眯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼烁巫,長吁一口氣:“原來是場噩夢啊……” “哼署隘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亚隙,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤磁餐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诊霹,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羞延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脾还。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伴箩。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙漏,靈堂內(nèi)的尸體忽然破棺而出嗤谚,到底是詐尸還是另有隱情,我是刑警寧澤怔蚌,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布巩步,位于F島的核電站,受9級特大地震影響桦踊,放射性物質(zhì)發(fā)生泄漏椅野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一籍胯、第九天 我趴在偏房一處隱蔽的房頂上張望竟闪。 院中可真熱鬧,春花似錦芒炼、人聲如沸瘫怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲸湃。三九已至,卻和暖如春子寓,著一層夾襖步出監(jiān)牢的瞬間暗挑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工斜友, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炸裆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓鲜屏,卻偏偏與公主長得像烹看,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洛史,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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