在實際的開發(fā)中我們會經(jīng)常遇見的問題就是圖片加載那先,需要自己寫工具類去加載农猬,還要根據(jù)實際的情況去做緩存、圓形圖售淡。對于我這樣的新手且無法完美解決的時候就想有個第三方框架來幫助我們解決這個事情斤葱。在12年的時候用的ImageLoader,后來用的就是Glide,這里講下glide的基本用法先揖闸。這里是基于Glide4.9.0揍堕,以后的源碼解析也基于這個版本做吧。
1.先說下怎么引用
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
首先在我們的App下的buil.gradle文件中的dependencies{}加入Glide的引用汤纸。
2.如何使用
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.into(mImageView2);
這里說明下基于4.9.0的
2.1 with(),with是我們傳入上下文來支持后面的操作等鹤啡。這里面的參數(shù)有多個(),這個方法在最底層需要傳入的是Context上下文蹲嚣,而我們可以傳入的有View递瑰、Context、Activity隙畜、Fragment抖部、FragmentActivity,其中Fragment支持android.app.Fragment和android.support.v4.app.Fragment,但是android.app.Fragment已經(jīng)開始不推薦使用了议惰,我們最好可以在使用中傳入Context上下文慎颗。
2.2 load(),load是我們告訴程序我們的數(shù)據(jù)源在哪里。load也支持多參數(shù)言询,這里我們可以傳入的有Uri俯萎、File、byte[]运杭、Object夫啊、Bitmap、String辆憔、Drawable撇眯、Integer报嵌、URl,其中Url不推薦使用熊榛,我先說下為什么URL不推薦使用了吧锚国,在實際開發(fā)中我們得到的數(shù)據(jù)往往是String類型,如果我們再轉(zhuǎn)換為URL玄坦,我們就需要處理異常血筑,因為我們無法保證在轉(zhuǎn)換為URL的時候不會出現(xiàn)異常,畢竟客戶端處理的數(shù)據(jù)是來自服務(wù)端煎楣,在發(fā)版后是不可控的豺总,我們可以直接使用String傳入就可以了。這里的laod其實就是告知我們的數(shù)據(jù)源是從哪里來的转质,然后由不同的方法進行處理园欣。
2.3 into(),into是我們需要告知程序我們的圖片最終在哪里顯示休蟹。into同樣支持多參數(shù)沸枯,大概可分為2種ImageView和Y(Y extends Target<TranscodeType>),但是實際開發(fā)中我們傳入的大多都是ImageView赂弓。
到了這里我們已經(jīng)可以對Glide的基本使用绑榴,有了簡單的認知了,我們可以將各種數(shù)據(jù)源的圖片顯示到了我們的界面上了盈魁,其實還是很簡單的翔怎。假如我們需要進行緩存呢?Glide能不能幫我們解決這件事杨耙,答案是可以的赤套,Glide默認進行了三級緩存操作,而且給了我們緩存的策略進行緩存內(nèi)容的設(shè)置珊膜。
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(mImageView2);
我們發(fā)現(xiàn)這里只是加了行代碼調(diào)用了diskCacheStrategy()容握,然后告知程序我們需要做什么,這里在用的時候我們需要知道以下內(nèi)容
DiskCacheStrategy是緩存策略车柠,有以下幾個參數(shù)剔氏,并詳細說明該策略的保存信息。
1) ALL 網(wǎng)絡(luò)資源執(zhí)行DATA竹祷、RESOURCE谈跛,本地資源執(zhí)行RESOURCE
2) NONE 不緩存任何內(nèi)容
3) DATA 緩存原始圖片
4) RESOURCE 緩存解碼后的圖片
5) AUTOMATIC 根據(jù)圖片資源智能地選擇使用哪一種緩存策略(默認選項)
這里緩存策略我們會用了,在實際開發(fā)中我們很少用到這些塑陵。
下面我們繼續(xù)說個常用的感憾,站位圖和錯誤圖,在Glide上使用占位圖和錯誤圖很簡單就可以做到
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.mipmap.ic_launcher1)
.placeholder(R.mipmap.ic_launcher1
.into(mImageView2);
通過placeholder設(shè)置本地的占位圖和error設(shè)置錯誤圖就可以實現(xiàn)我們的需求了猿妈,這兩個方法均可以設(shè)置Drawable吹菱、本地圖片資源和RequestBuilder<TranscodeType>巍虫,前兩個比較清楚彭则,后面一個我們后面再去分析鳍刷。
到這里基本上就能滿足我們?nèi)粘P枨罅耍旅嬖倏聪翯lide中有什么方法俯抖,可能會在開發(fā)中使用到
- listener 這里我們可以對加載圖片進行處理输瓜,加載成功和加載失敗兩個方法
- addListener 和listener不同的是,listener是清空了監(jiān)聽芬萍,把當(dāng)前監(jiān)聽加入進去尤揣,addListener是不清空監(jiān)聽,既不影響其他地方調(diào)用的監(jiān)聽柬祠,僅僅是把當(dāng)前的監(jiān)聽加入進去北戏,建議使用addListener,其他和listener相同
- .centerInside() .fitCenter() .centerCrop() 這三種圖片處理方式漫蛔,centerInside等比例縮小顯示嗜愈,在橫向或豎向上相等,不會進行放大莽龟。fitCenter等比例放大或縮小蠕嫁。centerCrop等比例放大。
- override(int w,int h)這個方法會將圖片以制定的高寬顯示在ImageView上
5.apply(RequestOptions.bitmapTransform(new RoundedCorners(dp2px(60)))) 這個方法可以設(shè)置為圓形圖了毯盈。 - .optionalFitCenter() 同樣可以圓形
Glide.with(MainActivity.this)
.load(headPic)
.apply(RequestOptions.bitmapTransform(new RoundedCorners(dp2px(60))))
.into(mImageView1);
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
差不多就這些了剃毒,其實還是蠻簡單的。下次寫glide就要看看了搂赋,這次還是比較匆忙的赘阀,下次寫就寫寫transform和glide的緩存。
transform這個 暫時不想寫了脑奠,大家可以去看下glide-transformations這個大概看了下 已經(jīng)能滿足日常了基公。