[轉(zhuǎn)載]Glide

轉(zhuǎn)載至:http://linanyang.com/2016/04/29/Glide/

介紹

Glide由bumptech團(tuán)隊(duì)開發(fā)养泡,在2014年Google正式推出,廣泛的用在Google的開源項(xiàng)目中,Glide與Picasso有著很高的相似度焚鲜,細(xì)節(jié)上有不少的區(qū)別你弦,Glide比Picasso加載速度快铡溪,也比Picasso需要更大的緩存空間毅否。

導(dǎo)入庫(kù)

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

基本用法

Glide 用起來(lái)非常簡(jiǎn)單

Glide.with(context)  
     .load(http://img1.imgtn.bdimg.com/it/u=3519779342,2692245303&fm=15&gp=0.jpg")  
     .into(imageview); 

這就是加載一張圖片的代碼

常見(jiàn)設(shè)置

  • .placeholder() 占位圖片
  • .error() 加載失敗
  • .crossFade()淡入淡出
  • .dontAnimate()無(wú)動(dòng)畫效果
  • .override()調(diào)整圖片大小
  • .transform()自定義圖形轉(zhuǎn)換
  • .skipMemoryCache(true)不做內(nèi)存緩存
  • .diskCacheStrategy(DiskCacheStrategy.ALL)磁盤緩存
  • DiskCacheStrategy.ALL 緩存所有版本的圖片
  • DiskCacheStrategy.NONE 不緩存任何圖片
  • DiskCacheStrategy.SOURCE 只緩存全分辨率的圖像
  • DiskCacheStrategy.RESULT 只緩存經(jīng)過(guò)處理的圖片

用法(Glide可以加載gif圖片 但是會(huì)消耗太多內(nèi)存 謹(jǐn)慎使用)

    Glide.with(mContext)
         .load(R.drawable.steven)
         .dontAnimate()
         .placeholder(R.mipmap.ic_launcher)
         .error(R.mipmap.ic_launcher)
         .diskCacheStrategy(DiskCacheStrategy.ALL)
         .transform(new BitmapRotateTransformation(mContext , 90f))  自定義將圖片旋轉(zhuǎn)90°
         .into(imageView);

高級(jí)用法

設(shè)置網(wǎng)絡(luò)訪問(wèn)庫(kù)

設(shè)置為什么網(wǎng)絡(luò)請(qǐng)求庫(kù)就導(dǎo)入什么集成包矮固,比如okhttp需導(dǎo)入

  • compile 'com.github.bumptech.glide:okhttp-integration:1.4.0'

      //在Application設(shè)置Glide網(wǎng)絡(luò)訪問(wèn)方式
      Glide.get(this).register(GlideUrl.class, InputStream.class,new OkHttpUrlLoader.Factory(單例一個(gè)okhttpclien對(duì)象);
      //register(Class<T> modelClass,Class<Y> resourceClass,ModelLoaderFactory<T, Y> factory)前兩個(gè)參數(shù)為第三個(gè)參數(shù)的泛型
    

監(jiān)聽加載進(jìn)度

在調(diào)用.into()方法的時(shí)候不直接設(shè)置target,而是

    Glide.with(mContext).load(urlString_net)
                        .dontAnimate()        
                        .skipMemoryCache(true)
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .error(R.mipmap.ic_launcher)
                        .into(new GlideDrawableImageViewTarget(imageView) { //加載失敗
                            @Override
                            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                                super.onLoadFailed(e, errorDrawable);
    
                            }
    
                            @Override
                            public void onLoadStarted(Drawable placeholder) {//加載開始
                                super.onLoadStarted(placeholder);
    
                            }
    
                            @Override
                            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {//加載完成
                                super.onResourceReady(resource, animation);
    
                            }
                        });

設(shè)置緩存大小及清除緩存

設(shè)置緩存大小

public class CustomGlideModule implements GlideModule {
       @Override
    public void applyOptions(Context context, GlideBuilder builder) {//應(yīng)用選項(xiàng)

//        .setMemoryCache(MemoryCache memoryCache)   
//        .setBitmapPool(BitmapPool bitmapPool)         
//        .setDiskCache(DiskCache.Factory diskCacheFactory) 
//        .setDiskCacheService(ExecutorService service)    
//        .setResizeService(ExecutorService service)  
//        .setDecodeFormat(DecodeFormat decodeFormat) 

    builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

    int cacheSize = 10 << 20;
    builder.setDiskCache(
            new InternalCacheDiskCacheFactory(context, cacheSize) 內(nèi)部緩存
            //new ExternalCacheDiskCacheFactory(context, cacheSize) 外部緩存
    );
}

@Override
public void registerComponents(Context context, Glide glide) {//注冊(cè)組件
    // nothing to do here
    }
}

在AndroidManifest創(chuàng)建

<meta-data
       android:name="cn.lny.glide.CustomGlideModule"
       android:value="GlideModule" />

清除緩存

//清除內(nèi)存緩存
Glide.get(mContext).clearMemory();
//清除磁盤緩存
new Thread(new Runnable() {
    @Override
    public void run() {
           Glide.get(mContext).clearDiskCache();
    }

注意:清除磁盤緩存必須在子線程

圖形轉(zhuǎn)換

旋轉(zhuǎn)

public class BitmapRotateTransformation extends BitmapTransformation {

private float rotateRotationAngle = 0f;

public BitmapRotateTransformation(Context context, float rotateRotationAngle) {
    super(context);

    this.rotateRotationAngle = rotateRotationAngle;
    }

@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
    Matrix matrix = new Matrix();
    matrix.postRotate(rotateRotationAngle);
    Bitmap result = Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        result.setConfig(Bitmap.Config.ARGB_8888);
    }
    return result;
    }

@Override
public String getId() {
    return getClass().getName();
    }
}

切圓角

public class BitmapCircleTransformation extends BitmapTransformation {
public BitmapCircleTransformation(Context context) {
    super(context);
}

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


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

    //創(chuàng)建一個(gè)空白Bitmap氯质,將在該Bitmap上鋪設(shè)畫布進(jìn)行繪圖
    Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_4444);
    if (result == null) {
        result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_4444);
    }

    Canvas canvas = new Canvas(result);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    //選擇原圖中的中心矩形募舟,繪制在畫布上
    Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
    paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
    float r = size / 2f;
    canvas.drawCircle(r, r, r, paint);
    return result;
    }

@Override
public String getId() {
    return getClass().getName();
    }
}

總結(jié)

Glide庫(kù)在使用過(guò)程中內(nèi)存占用低,擴(kuò)展性強(qiáng)闻察。無(wú)法設(shè)置加載圖片的最大寬高拱礁,無(wú)法指定刪除某一個(gè)圖片的緩存(可以用加signature的方式試其失效并重新下載,但不可以刪除)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辕漂,一起剝皮案震驚了整個(gè)濱河市呢灶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钉嘹,老刑警劉巖鸯乃,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異跋涣,居然都是意外死亡飒责,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門仆潮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人遣臼,你說(shuō)我怎么就攤上這事性置。” “怎么了揍堰?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵鹏浅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屏歹,道長(zhǎng)隐砸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任蝙眶,我火速辦了婚禮季希,結(jié)果婚禮上褪那,老公的妹妹穿的比我還像新娘。我一直安慰自己式塌,他們只是感情好博敬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峰尝,像睡著了一般偏窝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上武学,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天祭往,我揣著相機(jī)與錄音,去河邊找鬼火窒。 笑死硼补,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沛鸵。 我是一名探鬼主播括勺,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曲掰!你這毒婦竟也來(lái)了疾捍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栏妖,失蹤者是張志新(化名)和其女友劉穎乱豆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊趾,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛裕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了论泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揩尸。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屁奏,靈堂內(nèi)的尸體忽然破棺而出岩榆,到底是詐尸還是另有隱情,我是刑警寧澤坟瓢,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布勇边,位于F島的核電站,受9級(jí)特大地震影響折联,放射性物質(zhì)發(fā)生泄漏粒褒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一诚镰、第九天 我趴在偏房一處隱蔽的房頂上張望奕坟。 院中可真熱鬧祥款,春花似錦、人聲如沸执赡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沙合。三九已至奠伪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間首懈,已是汗流浹背绊率。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留究履,地道東北人滤否。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像最仑,于是被迫代替她去往敵國(guó)和親藐俺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 學(xué)習(xí)來(lái)源:郭霖大師博客地址 1泥彤、圖片加載框架挺多欲芹,如Volley、Glide吟吝、Picasso菱父、Fresco、本次是...
    子謙寶寶閱讀 1,743評(píng)論 0 6
  • 一剑逃、簡(jiǎn)介 在泰國(guó)舉行的谷歌開發(fā)者論壇上浙宜,谷歌為我們介紹了一個(gè)名叫Glide的圖片加載庫(kù),作者是bumptech蛹磺。這...
    天天大保建閱讀 7,453評(píng)論 2 28
  • 7.1 壓縮圖片 一粟瞬、基礎(chǔ)知識(shí) 1、圖片的格式 jpg:最常見(jiàn)的圖片格式萤捆。色彩還原度比較好亩钟,可以支持適當(dāng)壓縮后保持...
    AndroidMaster閱讀 2,487評(píng)論 0 13
  • 在一個(gè) Gradle 項(xiàng)目中在你的 build.gradle中添加下面這行代碼: 從一個(gè) URL 中加載圖片就像 ...
    A_Coder閱讀 1,967評(píng)論 0 4
  • Glide 是一個(gè) android 平臺(tái)上的快速和高效的開源的多媒體資源管理庫(kù),提供 多媒體文件的壓縮,內(nèi)存和磁盤...
    帥氣的歐巴閱讀 2,762評(píng)論 1 18