Glide v4

Photo by Jakob Owens on Unsplash

學(xué)習(xí)于:https://bumptech.github.io/glide/
http://blog.csdn.net/u013005791/article/details/74532091

  • GlideV4中如centerCrop()废离,placeholder()等方法已經(jīng)不能直接通過流式API的方式調(diào)用端礼;
    如果還是想通過V3版本的方式調(diào)用婶溯,官方也提供了一種解決方案:

  • 添加依賴

repositories {
  mavenCentral()
}

dependencies {
    compile 'com.github.bumptech.glide:glide:4.0.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
    compile 'com.android.support:support-v4:25.3.1'
}

并且創(chuàng)建一個AppGlideModule的實(shí)現(xiàn)類蜀肘,之后Rebuild工程,然后就能找到GlideApp對象了旱爆,然后就可以和Glide v3一樣使用了黔帕;

AppGlideModule如果注釋不存在鄙信,則不會發(fā)現(xiàn)該模塊,并且您將在日志中看到一條帶有Glide日志標(biāo)記的警告瓤的,該日志標(biāo)記指示該模塊無法找到休弃。


接下來將在V4基礎(chǔ)上重新學(xué)習(xí)Glide的用法;

  • RequestOptions
    Glide中的大多數(shù)設(shè)置都可以使用RequestOptions類和apply()方法來應(yīng)用圈膏;
        /**
         * 磁盤緩存策略:diskCacheStrategy(DiskCacheStrategy.NONE)
         *
         * DiskCacheStrategy.ALL 使用DATA和RESOURCE緩存遠(yuǎn)程數(shù)據(jù)塔猾,僅使用RESOURCE來緩存本地數(shù)據(jù)。
         * DiskCacheStrategy.NONE 不使用磁盤緩存
         * DiskCacheStrategy.DATA 在資源解碼前就將原始數(shù)據(jù)寫入磁盤緩存
         * DiskCacheStrategy.RESOURCE 在資源解碼后將數(shù)據(jù)寫入磁盤緩存稽坤,即經(jīng)過縮放等轉(zhuǎn)換后的圖片資源桥帆。
         * DiskCacheStrategy.AUTOMATIC 根據(jù)原始圖片數(shù)據(jù)和資源編碼策略來自動選擇磁盤緩存策略。
         */

        /**
         * 優(yōu)先級:priority(Priority.HIGH)
         * 
         * Priority.LOW 
         * Priority.NORMAL 
         * Priority.HIGH 
         * Priority.IMMEDIATE
         */

        RequestOptions options = new RequestOptions()
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .fallback(R.mipmap.ic_launcher)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .priority(Priority.HIGH)
                .override(800,800)
                .circleCrop();
//                .transform(new GlideRoundTransform (context))
//                .centerInside();
//                .centerCrop();


        Glide.with(this)
                .load(R.mipmap.gifpic)
                .apply(options)
                .into(imageView);

**清除緩存**:
//清理磁盤緩存 需要在子線程中執(zhí)行
 Glide.get(this).clearDiskCache();
//清理內(nèi)存緩存 可以在UI主線程中進(jìn)行
 Glide.get(this).clearMemory();

apply:應(yīng)用ResquestOptions對象慎皱,該方法可以調(diào)用多次老虫,但是如果兩次apply存在沖突的設(shè)置,會以最后一次為準(zhǔn)茫多;

placeholder(占位符):當(dāng)請求成功完成時祈匙,占位符將被替換為請求的資源。如果從內(nèi)存中加載所請求的資源,則占位符可能永遠(yuǎn)不會顯示夺欲。如果請求失敗跪帝,并且未設(shè)置error(),占位符將繼續(xù)顯示些阅。類似地伞剑,如果所請求的url / model是null并且既不設(shè)置error()也不是fallback(),則占位符也將繼續(xù)顯示市埋;
占位符是從Android資源在主線程上加載的黎泣,所以盡可能是小的容易緩存的資源;
error:當(dāng)請求永久失敗時顯示缤谎。如果所請求的url / model是null并且沒有設(shè)置fallback()抒倚,則也顯示;
fallback:當(dāng)請求的url / model是null的時候坷澡,顯示fallback()設(shè)置的資源托呕;

CenterCrop:縮放寬和高都到達(dá)View的邊界,有一個參數(shù)在邊界上频敛,另一個參數(shù)可能在邊界上项郊,也可能超過邊界;
CenterInside :如果寬和高都在View的邊界內(nèi)斟赚,那就不縮放呆抑,否則縮放寬和高都進(jìn)入View的邊界,有一個參數(shù)在邊界上汁展,另一個參數(shù)可能在邊界上鹊碍,也可能在邊界內(nèi);
CircleCrop :圓形且結(jié)合了CenterCrop的特性食绿;
FitCenter:縮放寬和高都進(jìn)入View的邊界侈咕,有一個參數(shù)在邊界上,另一個參數(shù)可能在邊界上器紧,也可能在邊界內(nèi)耀销;
但是其實(shí)完全可以在layout文件中設(shè)置ImageView為android:scaleType="centerCrop",Glide會自動根據(jù)這個屬性設(shè)置圖片的顯示方式铲汪;

overrid:Glide 會根據(jù)ImageView的大小熊尉,自動限制圖片緩存和內(nèi)存中的大小,同時也可以調(diào)用override(width, height)限制圖片的大姓蒲狰住;

transform:自定義GlideRoundTransform類實(shí)現(xiàn)圓角圖片;

/**
 * Created by whstywh on 2017/4/5
 * GitHub:https://github.com/whstywh
 * email:whstywh@gmail.com
 * description:自定義Glide圓角圖片類
 */

public class GlideRoundTransform extends BitmapTransformation {

    public GlideRoundTransform(Context context) {
        super(context);
    }

    /**
     * 重寫 生成圓角圖片
     *
     * @param pool
     * @param toTransform
     * @param outWidth
     * @param outHeight
     * @return
     */
    @Override
    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        //畫布中背景圖片與繪制圖片交集部分
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
    }
}

  • TransitionOptions
    有三種:
    GenericTransitionOptions
    DrawableTransitionOptions
    BitmapTransitionOptions

為避免突然變化齿梁,您可以在圖像切換時設(shè)置淡入淡出催植;

       Glide.with(this)
               .load(R.mipmap.gifpic)
               .apply(options)
               .transition(DrawableTransitionOptions.withCrossFade())
//                .transition(BitmapTransitionOptions.withCrossFade())
//                .transition(GenericTransitionOptions.with())
               .into(imageView);

TransitionOptions并且與Glide要加載的資源類型相關(guān)肮蛹;
因此,如果你要求Drawable创南,則需要使用交叉淡入淺出DrawableTransitionOptions.withCrossFade()伦忠,如果您要求Bitmap,則需要使用簡單的淡入淡出BitmapTransitionOptions.withCrossFade()稿辙;如果既不是Bitmap也不是Drawable可以使用GenericTransitionOptions昆码;

如果要使用自定義的動畫,可以使用GenericTransitionOptions.with(int viewAnimationId)或者BitmapTransitionOptions.withCrossFade(int animationId, int duration)或者DrawableTransitionOptions.withCrossFade(int animationId, int duration)邻储;

出于性能考慮赋咽,最好不要在ListView,GridView,RecycleView中使用過渡動畫,可以使用.dontAnimate()不加載動畫:

        RequestOptions options = new RequestOptions()
                ...
                .dontAnimate()
  • RequestBuilder
        RequestBuilder<Drawable> requestBuilder = Glide.with(this)
                .asGif()
//                .asBitmap()
//                .asDrawable()
//                .asFile()
                .load(R.mipmap.gifpic);

        requestBuilder.thumbnail(0.1f)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        Log.d("flag", "onLoadFailed");
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        Log.d("flag", "onResourceReady");
                        return false;
                    }
                })
                .apply(options)
                .transition()
                .into(imageView);

with:方法相比Picasso而言不僅接受Context,還接受Activity芥备,F(xiàn)ragment冬耿,View舌菜;


加載GIF
如果使用了.asGif()方法萌壳,圖片會強(qiáng)制轉(zhuǎn)換成gif圖,此時傳入的圖片就必須是gif圖日月,否則會報錯袱瓮。當(dāng)然不使用.asGif()方法同樣也可以加載gif圖;
load:方法中可以傳入聯(lián)網(wǎng)請求的url爱咬,資源id尺借,F(xiàn)ile;相比Picasso還支持GIF圖精拟,本地MP4播放燎斩;

thumbnail:設(shè)置縮略圖,傳入一個(0,1)之間的float數(shù)值時蜂绎,表示縮略圖為原圖的十分之幾栅表,如果縮略圖比全尺寸圖先加載完,就顯示縮略圖师枣,否則就不顯示怪瓶;如果縮略圖也來自網(wǎng)絡(luò)獲取時,代碼如下:

        requestBuilder.thumbnail(Glide.with(this).load(thumbnailUrl))
                 ...
                .into(imageView);

listener:監(jiān)聽資源加載的請求狀態(tài)践美,可以使用兩個回調(diào):onResourceReadyonLoadFailed洗贰,但不要每次請求都使用新的監(jiān)聽器,要避免不必要的內(nèi)存申請陨倡,可以使用單例進(jìn)行統(tǒng)一的異常監(jiān)聽和處理敛滋。
apply:應(yīng)用RequestOptions
transition:應(yīng)用TransitionOption


Recycle的加載優(yōu)化
只在拖動和靜止時加載,自動滑動時不加載兴革。

        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case RecyclerView.SCROLL_STATE_DRAGGING:
                        Glide.with(MainActivity.this).resumeRequests();//加載
                        break;
                    case RecyclerView.SCROLL_STATE_SETTLING:
                        Glide.with(MainActivity.this).pauseRequests();//暫停加載
                        break;
                    case RecyclerView.SCROLL_STATE_IDLE:
                        Glide.with(MainActivity.this).resumeRequests();//加載
                        break;
                }
            }
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

  • Glide和Picasso的區(qū)別

Glide默認(rèn)的Bitmap格式是RGB_565 矛缨,比 Picasso的ARGB_8888格式的內(nèi)存開銷要小一半。

Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實(shí)時重繪大小箕昭。而Glide加載的大小和ImageView的大小是一致的灵妨,因此內(nèi)存花銷更小。

Picasso和Glide在磁盤緩存策略上有很大的不同落竹。Picasso緩存的是全尺寸的泌霍,而Glide緩存的是跟ImageView尺寸相同的。

嘗試將ImageView調(diào)整成不同大小述召,但不管大小如何Picasso只緩存一個全尺寸的朱转。Glide則不同,它會為每種大小的ImageView緩存一次积暖。盡管一張圖片已經(jīng)緩存了一次藤为,但是假如你要在另外一個地方再次以不同尺寸顯示,則需要重新下載夺刑,調(diào)整成新尺寸的大小缅疟,然后將這個尺寸的也緩存起來。

另外Glide也可以既緩存全尺寸又緩存其他尺寸:

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

Glide的優(yōu)點(diǎn)是加載顯示非潮樵福快存淫。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致有一些延遲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沼填,一起剝皮案震驚了整個濱河市桅咆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坞笙,老刑警劉巖岩饼,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薛夜,居然都是意外死亡籍茧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門却邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕糊,“玉大人,你說我怎么就攤上這事腊徙〖蚴” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵撬腾,是天一觀的道長螟蝙。 經(jīng)常有香客問我,道長民傻,這世上最難降的妖魔是什么胰默? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任场斑,我火速辦了婚禮,結(jié)果婚禮上牵署,老公的妹妹穿的比我還像新娘漏隐。我一直安慰自己,他們只是感情好奴迅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布青责。 她就那樣靜靜地躺著,像睡著了一般取具。 火紅的嫁衣襯著肌膚如雪脖隶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天暇检,我揣著相機(jī)與錄音产阱,去河邊找鬼。 笑死块仆,一個胖子當(dāng)著我的面吹牛构蹬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榨乎,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼怎燥,長吁一口氣:“原來是場噩夢啊……” “哼瘫筐!你這毒婦竟也來了蜜暑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤策肝,失蹤者是張志新(化名)和其女友劉穎肛捍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體之众,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拙毫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棺禾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀蹄。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膘婶,靈堂內(nèi)的尸體忽然破棺而出缺前,到底是詐尸還是另有隱情,我是刑警寧澤悬襟,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布衅码,位于F島的核電站,受9級特大地震影響脊岳,放射性物質(zhì)發(fā)生泄漏逝段。R本人自食惡果不足惜垛玻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奶躯。 院中可真熱鬧帚桩,春花似錦、人聲如沸嘹黔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽参淹。三九已至醉锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浙值,已是汗流浹背恳不。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留开呐,地道東北人烟勋。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像筐付,于是被迫代替她去往敵國和親卵惦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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