Android glide圖片加載庫(kù)學(xué)習(xí)

到目前為止,網(wǎng)上有很多圖片加載庫(kù)扑媚,我就先來(lái)說(shuō)說(shuō)為什么選擇Glide來(lái)學(xué)習(xí)老玛。

Glide的特點(diǎn)

  1. 顯示圖片平緩流暢速度快
  2. 支持gif和webp格式圖片
  3. 擴(kuò)展性高可以轉(zhuǎn)換各種圖片效果
  4. 根據(jù)Activity/Fragment生命周期自動(dòng)管理請(qǐng)求
  5. ...

其它圖片加載庫(kù)有的Glide都有演怎,這里的特點(diǎn)是其它加載庫(kù)沒(méi)有的,還有很多特點(diǎn)這里就不一一列舉渊啰,是不是覺(jué)得很心動(dòng),下面我們就來(lái)學(xué)習(xí)怎么使用Glide吧~

github地址:https://github.com/bumptech/glide

這里主要是介紹在Andrid Studio上使用

配置環(huán)境

在builde.gradle里面添加上

  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'

要說(shuō)明的是glide是要依賴于support liberary v4

在AndroidManifest.xml添加所需權(quán)限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

基本使用

ImageView imageView = (ImageView)findViewById(R.id.my_image_view);
Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);

是不是特別簡(jiǎn)單一行代碼就搞定

常用配置

  1. 設(shè)置圖片格式
  2. 設(shè)置緩存目錄(data或SD卡)
  3. 設(shè)置內(nèi)存和硬盤緩存大小

創(chuàng)建MyGlideModule.java(名字可以隨便取)實(shí)現(xiàn)GlideModule接口申屹,實(shí)現(xiàn)里面兩個(gè)方法

public class MyGlideModule implements GlideModule{

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        //設(shè)置格式
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
        //緩存到data目錄下最大50M
        //緩存目錄為程序內(nèi)部緩存目錄/data/data/your_package_name/image_manager_disk_cache/(不能被其它應(yīng)用訪問(wèn))且緩存最大為250MB
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context,DiskCache.Factory.DEFAULT_DISK_CACHE_DIR,DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
        //緩存到外部磁盤SD卡上,字節(jié)
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));
        //設(shè)置內(nèi)存緩存大小
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
        builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
        builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        //glide.register(ImageFid.class,InputStream.class, new ImageFidLoader.Factory());
    }
}

在AndroidManifest.xml配置走搁,需要把包名更換成大家項(xiàng)目中MyGlideModule的包名

<application
        ...>
        <meta-data
            android:name="包名.MyGlideModule"
            android:value="GlideModule" />
</application>

設(shè)置格式ARGB_8888

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

設(shè)置緩存到data目錄下
/data/data/your_package_name/image_manager_disk_cache/
DiskCache.Factory.DEFAULT_DISK_CACHE_DIR為默認(rèn)緩存目錄名image_manager_disk_cache,可以修改自己想要的名稱
DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE為默認(rèn)緩存大小250M,參數(shù)單位是字節(jié)Byte,250M則是 250 ×1024×1024Byte

builder.setDiskCache(
    new InternalCacheDiskCacheFactory(context,
    DiskCache.Factory.DEFAULT_DISK_CACHE_DIR,
    DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));

設(shè)置緩存到SD卡下

builder.setDiskCache(
    new ExternalCacheDiskCacheFactory(context,
    DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, 
    DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE));

設(shè)置內(nèi)存緩存大小,這里設(shè)置的是默認(rèn)大小的1.2倍私植,默認(rèn)大小是多少還沒(méi)有測(cè)試下,大家可以運(yùn)行打印一下看看

MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));

獲取緩存大小和清除緩存

  • 清除內(nèi)存緩存
public void clearMemory(Context context){
    // 必須在UI線程中調(diào)用
    Glide.get(context).clearMemory();
}
  • 清除磁盤緩存
public void clearDiskCache(Context context){
    // 必須在后臺(tái)線程中調(diào)用车酣,建議同時(shí)clearMemory()
    Glide.get(context).clearDiskCache();
}
  • 清除view緩存
public void clearViewCache(View view){
    Glide.clear(view);
}
  • 獲取緩存大小
    public void getDiskCacheSize(Context context,TextView textView){
        //獲取data下
        new GetDiskCacheSizeTask(textView).execute(new File(context.getCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
        //獲取sd卡下
        //new GetDiskCacheSizeTask(textView).execute(new File(context.getExternalCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));
    }


    class GetDiskCacheSizeTask extends AsyncTask<File, Long, Long>{
        private final TextView resultView;

        public GetDiskCacheSizeTask(TextView resultView) {
            this.resultView = resultView;
        }

        @Override
        protected void onPreExecute() {
            resultView.setText("Calculating...");
        }

        @Override
        protected void onProgressUpdate(Long... values) { /* onPostExecute(values[values.length - 1]); */ }

        @Override
        protected Long doInBackground(File... dirs) {
            try {
                long totalSize = 0;
                for (File dir : dirs) {
                    publishProgress(totalSize);
                    totalSize += calculateSize(dir);
                }
                return totalSize;
            } catch (RuntimeException ex) {
                final String message = String.format("Cannot get size of %s: %s", Arrays.toString(dirs), ex);
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        resultView.setText("error");
                        Toast.makeText(resultView.getContext(),message,Toast.LENGTH_LONG).show();
                    }
                });
            }
            return 0L;
        }

        @Override
        protected void onPostExecute(Long size) {
            String sizeText = android.text.format.Formatter.formatFileSize(resultView.getContext(), size);
            resultView.setText(sizeText);
        }

        private long calculateSize(File dir) {
            if (dir == null) return 0;
            if (!dir.isDirectory()) return dir.length();
            long result = 0;
            File[] children = dir.listFiles();
            if (children != null)
                for (File child : children)
                    result += calculateSize(child);
            return result;
        }
    }

加載本地資源轉(zhuǎn)換

    //SD卡下圖片
    public String getSDSource(String fullPath){
        return "file://"+ fullPath;
    }

    //ASSETS下圖片
    public String getAssetsSource(String fileName){
        return "file:///android_asset/"+fileName;
    }

    //Raw下視頻可以解析一張圖片
    public String getRawSource(Context context,int rawRid){
        return "android.resource://"+context.getPackageName()+"/raw/"+rawRid;
    }
    
    //Drawable圖片
    public String getDrawableSource(Context context,int drawRid){
        return "android.resource://"+context.getPackageName()+"/drawable/"+drawRid;
    }

常用方法

        Glide.with(context)
                .load(url)                                          //加載資源
                .thumbnail(0.1f)                                    //用原圖的1/10作為縮略圖,如果縮略圖比全尺寸圖先加載完湖员,就顯示縮略圖贫悄,否則就不顯示
                //.thumbnail(getDrawableRequestBuilder(context,rid))    //本地資源作為縮略圖
                .centerCrop()                                       //設(shè)置scaleType
                .placeholder(null)                                  //設(shè)置資源加載過(guò)程中的占位Drawable。
                .crossFade()                                        //設(shè)置加載漸變動(dòng)畫
                .priority(Priority.NORMAL)                          //指定加載的優(yōu)先級(jí)娘摔,優(yōu)先級(jí)越高越優(yōu)先加載,但不保證所有圖片都按序加載凳寺。枚舉Priority.IMMEDIATE,Priority.HIGH逆趋,Priority.NORMAL晒奕,Priority.LOW。默認(rèn)為Priority.NORMAL脑慧。                                  
                .fallback(null)                                     //設(shè)置model為空時(shí)要顯示的Drawable闷袒。如果沒(méi)設(shè)置fallback,model為空時(shí)將顯示error的Drawable霜运,如果error的Drawable也沒(méi)設(shè)置,就顯示placeholder的Drawable藕各。
                .error(null)                                        //設(shè)置load失敗時(shí)顯示的Drawable焦除。
                .listener(listener)                                 //請(qǐng)求監(jiān)聽(tīng)
                .skipMemoryCache(true)                              //設(shè)置跳過(guò)內(nèi)存緩存,但不保證一定不被緩存(比如請(qǐng)求已經(jīng)在加載資源且沒(méi)設(shè)置跳過(guò)內(nèi)存緩存乌逐,這個(gè)資源就會(huì)被緩存在內(nèi)存中)。
                .diskCacheStrategy(DiskCacheStrategy.RESULT)        //緩存策略DiskCacheStrategy.SOURCE:緩存原始數(shù)據(jù)绢慢,DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)后的資源數(shù)據(jù)洛波,DiskCacheStrategy.NONE:什么都不緩存,DiskCacheStrategy.ALL:緩存SOURC和RESULT缚窿。默認(rèn)采用DiskCacheStrategy.RESULT策略焰扳,對(duì)于download only操作要使用DiskCacheStrategy.SOURCE。
                .bitmapTransform(new CropCircleTransformation(context))  //圓角裁切
                .into(imageView);      

.thumbnail(0.1f)用原圖的1/10作為縮略圖,如果縮略圖比全尺寸圖先加載完扫茅,就顯示縮略圖畜份,否則就不顯示
.thumbnail(getDrawableRequestBuilder(context,rid))用本地資源作為縮略圖

    public DrawableRequestBuilder<Integer> getDrawableRequestBuilder(Context context,int drawRid){
        return Glide
                .with(context)
                .load(drawRid);
    }

.placeholder(Drawable)設(shè)置資源加載過(guò)程中的占位Drawable
.fallback(Drawable)設(shè)置為空顯示的Drawable
.error(Drawable)設(shè)置加載失敗顯示的Drawable
.crossFade()設(shè)置加載漸變動(dòng)畫
.diskCacheStrategy(DiskCacheStrategy.RESULT)設(shè)置緩存策略爆雹,DiskCacheStrategy.SOURCE:緩存原始數(shù)據(jù)愕鼓,DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)后的資源數(shù)據(jù)册倒,DiskCacheStrategy.NONE:什么都不緩存磺送,DiskCacheStrategy.ALL:緩存SOURC和RESULT。默認(rèn)采用DiskCacheStrategy.RESULT策略崇呵,對(duì)于download only操作要使用DiskCacheStrategy.SOURCE馅袁。

轉(zhuǎn)換圖片效果

在builde.gradle里面添加上

compile 'jp.wasabeef:glide-transformations:2.0.1'

github地址:https://github.com/wasabeef/glide-transformations

.bitmapTransform(new RoundedCornersTransformation(context,30,0, RoundedCornersTransformation.CornerType.ALL))圓角處理

.bitmapTransform(new CropCircleTransformation(context))圓形處理
..bitmapTransform(new GrayscaleTransformation(context))灰度處理

...等等還有很多效果,感興趣的可以上github上找找api嘗試一些其它效果

如果想自定義圖片效果也是可以滴

public class MyTransformation extends BitmapTransformation{

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

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform,int outWidth, int outHeight) {
        Bitmap result = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
        // 如果BitmapPool中找不到符合該條件的Bitmap犹褒,get()方法會(huì)返回null叠骑,就需要我們自己創(chuàng)建Bitmap了
        if (result == null) {
            // 如果想讓Bitmap支持透明度,就需要使用ARGB_8888
            result = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);
        }
        //創(chuàng)建最終Bitmap的Canvas.
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setAlpha(128);
        // 將原始Bitmap處理后畫到最終Bitmap中
        canvas.drawBitmap(toTransform, 0, 0, paint);
        // 由于我們的圖片處理替換了原始Bitmap疙赠,就return我們新的Bitmap就行朦拖。
        // Glide會(huì)自動(dòng)幫我們回收原始Bitmap。
        return result;
    }

    @Override
    public String getId() {
        // 返回代表該變換的唯一Id捍岳,會(huì)作為cache key的一部分睬隶。
        // 注意:最好不要用getClass().getName(),因?yàn)槿菀资芑煜绊懸肌H绻儞Q過(guò)程不影響緩存數(shù)據(jù)恤左,可以返回空字符串飞袋。
        return "com.example.myapp.MyTransformation";
    }

}

Glide的學(xué)習(xí)也就到這里了,目前還沒(méi)有在項(xiàng)目中用起來(lái)巧鸭,大家用的過(guò)程中可能會(huì)碰到一些問(wèn)題纲仍,歡迎給我評(píng)論留言,共同交流學(xué)習(xí)進(jìn)步郑叠。

后面我也會(huì)陸續(xù)寫一些其它庫(kù)的學(xué)習(xí)文章锻拘,希望大家多多關(guān)注支持哈~

好記性不如爛筆頭击蹲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歌豺,一起剝皮案震驚了整個(gè)濱河市心包,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痕惋,老刑警劉巖娃殖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炉爆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赴捞,警方通過(guò)查閱死者的電腦和手機(jī)郁稍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門耀怜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人封寞,你說(shuō)我怎么就攤上這事。” “怎么了抖锥?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵碎罚,是天一觀的道長(zhǎng)荆烈。 經(jīng)常有香客問(wèn)我竟趾,道長(zhǎng)宫峦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任犀勒,我火速辦了婚禮贾费,結(jié)果婚禮上檐盟,老公的妹妹穿的比我還像新娘。我一直安慰自己箱玷,他們只是感情好陌宿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布壳坪。 她就那樣靜靜地躺著,像睡著了一般爽蝴。 火紅的嫁衣襯著肌膚如雪蝎亚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天躺彬,我揣著相機(jī)與錄音梅惯,去河邊找鬼。 笑死她君,一個(gè)胖子當(dāng)著我的面吹牛葫哗,可吹牛的內(nèi)容都是我干的球涛。 我是一名探鬼主播校镐,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灭翔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哄褒?” 一聲冷哼從身側(cè)響起煌张,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骏融,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后怀泊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體误趴,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凉当,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忠藤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楼雹。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烘豹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筷笨,我是刑警寧澤龟劲,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布昌跌,位于F島的核電站照雁,受9級(jí)特大地震影響饺蚊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜污呼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一燕酷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饵蒂,春花似錦酱讶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至漓骚,卻和暖如春榛泛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孤个。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工齐鲤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人给郊。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓淆九,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饲窿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煤搜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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