Glide 圖片加載庫(kù)詳細(xì)用法

Gilde 定義

Gilde 是google開(kāi)源的圖片加載庫(kù)术瓮。

glide依賴

//glide
compile 'com.github.bumptech.glide:glide:4.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'

glide 基礎(chǔ)用法

glide 用法傳承目前流行的鏈?zhǔn)秸{(diào)用。

/**
 * 基礎(chǔ)用法.
 */
private void baseUsed(){
    Glide.with(this)
            .load(URL)
            .into(mImageView);
}

glide 可以用RequestOptions配置各種參數(shù):

private void gildeOptions(){
    RequestOptions options = new RequestOptions();
    options.centerCrop()
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata);

    Glide.with(this)
            .load(URL)
            .apply(options)
            .into(mImageView);
}

其中Built in types:

  • CenterCrop:類似 ScaleType.CENTER_CROP
  • FitCenter: 類似 ScaleType.FIT_CENTER
  • CircleCrop: 圓形裁剪
  1. placeholder: 占位即加載中的圖片贰健。
  2. error: 錯(cuò)誤圖片.
  3. fallback: 當(dāng)url為null的時(shí)候胞四,判斷是否設(shè)置了fallback,是的話則顯示fallback圖片伶椿,否的話顯示error圖片辜伟,如果error還是沒(méi)有設(shè)置則顯示placeholder圖片.

這幾個(gè)圖片顯示規(guī)則:

glide.png

glide RequestBuilders還可以重用開(kāi)始多個(gè)加載

private void multipleLoad(){

    RequestOptions options = new RequestOptions();
    options.centerCrop()
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata);

    RequestBuilder<Drawable> requestBuilder =
            Glide.with(this)
                    .asDrawable().apply(options);


    for(int i=0;i<mImageGroup.getChildCount();i++){
        ImageView view = (ImageView) mImageGroup.getChildAt(i);
        requestBuilder.clone()
                .load(urls[i])
                .into(view);
    }
}

AppGlideModule 用法

在glide4中引入 glideApp,通過(guò)annotation將option封裝自動(dòng)生成代碼脊另。

第一步必須自定義一個(gè)module 繼承于AppGlideModule导狡。

@GlideModule
public final class MyGlideModule extends AppGlideModule {

}

注意: AppGlideModule實(shí)現(xiàn)必須始終與@GlideModule注釋一起出現(xiàn).如果注釋不存在,則該模塊將不會(huì)被發(fā)現(xiàn)偎痛。重新編譯旱捧,會(huì)自動(dòng)生成代碼,后面可用GlideApp.with() 代替Glide.with()

1踩麦、設(shè)置手機(jī)默認(rèn)推薦緩存大小枚赡。MemorySizeCalculator類通過(guò)考慮設(shè)備給定的可用內(nèi)存和屏幕大小想出合理的默認(rèn)大小.

/**
 * MemorySizeCalculator類通過(guò)考慮設(shè)備給定的可用內(nèi)存和屏幕大小想出合理的默認(rèn)大小.
 * 通過(guò)LruResourceCache進(jìn)行緩存。
 * @param context
 * @param builder
 */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
    MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
            .setMemoryCacheScreens(2)
            .build();
    builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
}

2靖榕、自定義內(nèi)存緩存大小


/**
 * 自定義緩存大小.
 * @param context
 * @param builder
 */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
    int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
    builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
}

3标锄、Disk Cache.自定義內(nèi)置磁盤緩存大小

/**
 * Disk Cache.自定義內(nèi)置磁盤緩存大小.
 * @param context
 * @param builder
 */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
    int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
    builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
}

4顽铸、Disk Cache.自定義內(nèi)置磁盤緩存大小并指定路徑.

/**
 * Disk Cache.自定義內(nèi)置磁盤緩存大小并指定路徑.
 * @param context
 * @param builder
 */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
    int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
    builder.setDiskCache(
            new InternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
}

5茁计、Disk Cache.自定義外置磁盤緩存大小并指定路徑.

/**
 * Disk Cache.自定義外置磁盤緩存大小并指定路徑.
 * @param context
 * @param builder
 */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
    int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
    builder.setDiskCache(
            new ExternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
}

isManifestParsingEnabled 設(shè)置清單解析,設(shè)置為false,避免添加相同的modules兩次

@Override
public boolean isManifestParsingEnabled() {
    return false;
}

GlideApp用法

基本用法

private void gildeAppUsed(){
    GlideApp.with(this)
            .load(URL1)
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata)
            .into(mImageView);
}

設(shè)置完全緩存

/**
 * 緩存.
 */
private void diskCacheStrategyAll(){
    GlideApp.with(this)
            .asBitmap()
            .load(URL)
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(mImageView);
}
  • DiskCacheStrategy.NONE 不做磁盤緩存
  • DiskCacheStrategy.SOURCE 只緩存圖像原圖
  • DiskCacheStrategy.RESULT 只緩存加載后的圖像星压,即處理后最終顯示時(shí)的圖像
  • DiskCacheStrategy.ALL 緩存所有版本的圖像(默認(rèn)行為)

只從緩存中讀取践剂,如果緩存沒(méi)有,則失敗.

private void retrieveFromCache(){
    GlideApp.with(this)
            .asBitmap()
            .load(URL)
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata)
            .onlyRetrieveFromCache(true)
            .into(mImageView);
}

跳過(guò)緩存. 每次都從服務(wù)端獲取最新.

/**
 * 跳過(guò)緩存. 每次都從服務(wù)端獲取最新.
 * diskCacheStrategy: 磁盤緩存
 * skipMemoryCache:內(nèi)存緩存
 */
private void skipCache(){
    GlideApp.with(this)
            .asBitmap()
            .load(URL)
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .skipMemoryCache(true)
            .into(mImageView);
}

清除緩存

/**
 * 清除內(nèi)存緩存.
 */
private void clearMemoryCache(){
    // This method must be called on the main thread.
    Glide.get(this).clearMemory();
}

/**
 * 清除磁盤緩存.
 */
private void clearDiskCache(){

    new AsyncTask<Void,Void,Void>(){

        @Override
        protected Void doInBackground(Void... params) {
            // This method must be called on a background thread.
            Glide.get(getApplicationContext()).clearDiskCache();
            return null;
        }
    };
}

其他

自定義圓角Transform

public class CircleTransform extends BitmapTransformation {

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

    @Override
    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool,toTransform);
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {

    }

    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;
    }
}

調(diào)用:

/**
 * 自定義圓形裁剪.
 */
private void customerOptions(){
    RequestOptions options = new RequestOptions();
    options.centerCrop()
            .placeholder(R.drawable.default_avatar)
            .error(R.drawable.image_error)
            .fallback(R.drawable.fallback_nodata)
            .transform(new CircleTransform(this));

    Glide.with(this)
            .load(URL)
            .apply(options)
            .into(mImageView);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娜膘,一起剝皮案震驚了整個(gè)濱河市逊脯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竣贪,老刑警劉巖军洼,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異演怎,居然都是意外死亡匕争,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門爷耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甘桑,“玉大人,你說(shuō)我怎么就攤上這事歹叮∨芎迹” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵咆耿,是天一觀的道長(zhǎng)德谅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)票灰,這世上最難降的妖魔是什么女阀? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮屑迂,結(jié)果婚禮上浸策,老公的妹妹穿的比我還像新娘。我一直安慰自己惹盼,他們只是感情好庸汗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著手报,像睡著了一般蚯舱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掩蛤,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天枉昏,我揣著相機(jī)與錄音,去河邊找鬼揍鸟。 笑死兄裂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晰奖,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谈撒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匾南?” 一聲冷哼從身側(cè)響起啃匿,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛆楞,沒(méi)想到半個(gè)月后溯乒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豹爹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年橙数,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅戒。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灯帮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逻住,到底是詐尸還是另有隱情钟哥,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布瞎访,位于F島的核電站腻贰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扒秸。R本人自食惡果不足惜播演,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伴奥。 院中可真熱鬧写烤,春花似錦、人聲如沸拾徙。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尼啡。三九已至暂衡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崖瞭,已是汗流浹背狂巢。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书聚,地道東北人唧领。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓代态,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親疹吃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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