來自于 Glide - 開始擅威!
1、依賴:
compile 'com.github.bumptech.glide:glide:3.6.0'
2冈钦、基本使用:
Glide.with(context) //參數(shù)Activity/Fragment
//設(shè)置路徑
.load(circleItem.getPics())
//緩存策略郊丛,緩存最終圖片
.diskCacheStrategy(DiskCacheStrategy.RESULT)
//占位圖
.error(R.drawable.ic_default_img).placeholder(R.drawable.ic_default_img)
//動畫
.crossFade()
//調(diào)整圖片像素大小
.override(320, 320)
//目標(biāo)圖片進(jìn)行裁剪
.fitCenter().into(((ItemViewHolder) holder).img);
其中幾個方法:
1、CenterCrop()和fitCenter()
分別對應(yīng)ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER瞧筛。
- CenterCrop():會縮放圖片讓圖片充滿整個ImageView的邊框厉熟,然后裁掉超出的部分。ImageVIew會被完全填充滿较幌,但是圖片可能不能完全顯示出揍瑟。
- fitCenter():會縮放圖片讓兩邊都相等或小于ImageView的所需求的邊框。圖片會被完整顯示乍炉,可能不能完全填充整個ImageView绢片。
2滤馍、硬盤緩存diskCacheStrategy():
- DiskCacheStrategy.NONE 什么都不緩存
- DiskCacheStrategy.SOURCE 僅僅只緩存原來的全分辨率的圖像
- DiskCacheStrategy.RESULT 僅僅緩存最終的圖像(轉(zhuǎn)換后的)
- DiskCacheStrategy.ALL 緩存所有版本的圖像(默認(rèn)行為)
如果已經(jīng)緩存過全尺寸圖片,則根據(jù)全尺寸圖片進(jìn)行調(diào)整底循,不用重新下載了
3巢株、override
如果沒有為圖片指定尺寸(override),默認(rèn)會以View的大小去限制圖片的大小
3此叠、特點(diǎn):
-
Glide支持遠(yuǎn)程圖片/本地圖片的獲取纯续、大小調(diào)整和展示
參考:使用Glide加載圖片系列之一從不同的數(shù)據(jù)源加載圖片 - 圖片加載會和Activity/Fragment的生命周期保持一致,如paused狀態(tài)暫停加載灭袁,resumed狀態(tài)又自動重新加載
- 支持GIF:Glide.with(context).load(““):GIF動畫圖片可以自動顯示為動畫效果
- 加載靜態(tài)圖片:Glide.with(context).load(“圖片路徑“).asBitmap()猬错,如果是gif,僅僅顯示第一幀茸歧。
- 加載gif:Glide.with(context).load(“圖片路徑“).asGif()倦炒,如果不是gif,會被當(dāng)作error處理软瞎。
- 如果相關(guān)的item已經(jīng)滾出了屏幕的范圍逢唤,Glide會自動取消超出屏幕的圖片請求。Glide是通過在ImageView上設(shè)置一個tag涤浇,在加載另外一張圖片之前檢查這個tag鳖藕,如果存在就取消第一次請求。
- 內(nèi)存緩存 更小的圖片 : Glide 以 url只锭、viewwidth著恩、viewheight、屏幕的分辨率等做為聯(lián)合 key蜻展,將處理后的圖片緩存在內(nèi)存緩存中喉誊,而不是原始圖片以節(jié)省大小
4、一些方法
1纵顾、關(guān)于downloadOnly伍茄、preload
- downloadOnly方法
downloadOnly不是用來重置圖片大小的,即便設(shè)置了大小施逾,也只會預(yù)緩存原始圖像敷矫,不會緩存“結(jié)果”圖像;參數(shù)通常為Target.SIZE_ORIGINAL汉额,如下:
Glide.with(this).load(url)
.downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL);
- preload
如果想要預(yù)緩存圖片沪饺,可以使用preload,注意前后的transformation(fitCenter)和size必須一致
Glide.with(this).load(url)
.diskCacheStrategy(DiskCacheStrategy.RESULT).fitCenter()
.preload(260,260);
downloadOnly僅僅進(jìn)行硬盤緩存(緩存SOURCE)闷愤,preload進(jìn)行硬盤和內(nèi)存緩存
參考:Difference between downloadOnly() and preload()件余、Is that downloadOnly not cache the image?
2讥脐、 Glide 中的回調(diào):Targets
Glide 提供了各種的 targets 遭居,可以在 Glide 做完網(wǎng)絡(luò)請求和處理之后,在這里得到返回的結(jié)果旬渠。
- SimpleTarget
只是想通過Glide加載一個Bitmap而不是把它顯示到View中
private SimpleTarget<Bitmap> simpleTarget=new SimpleTarget<Bitmap>(200,200) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
}
};
- ViewTarget:
通過Glide加載圖片到對應(yīng)的View中俱萍, 默認(rèn)不支持加載圖片到非ImageView 中,但是可以通過繼承 ViewTarget 和其子類實現(xiàn)告丢。- ViewTarget<T,Z>
- ImageViewTarget<Z>
- BitmapImageViewTarget:使用asBitmap()進(jìn)行加載的默認(rèn)目標(biāo)
- DrawableImageViewTarget
- GlideDrawableImageViewTarget:正常加載和使用asGif()進(jìn)行加載的默認(rèn)目標(biāo).
加載圖片到RelativeLayout中
private ViewTarget<RelativeLayout, GlideDrawable> viewTarget=new ViewTarget<RelativeLayout, GlideDrawable>(bgContainer) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setBackground(resource.getCurrent());
}
};
Glide.with(getActivity()).load(R.drawable.ic_main_bg).diskCacheStrategy(DiskCacheStrategy.NONE)
.into(viewTarget);
注意:
1枪蘑、在into()方法中,不要使用匿名內(nèi)部類:在 Glide 做完圖片請求之前岖免, Android 垃圾很可能會回收這個匿名內(nèi)部類對象岳颇,最終這可能會導(dǎo)致,當(dāng)圖像加載完成了颅湘,但是回調(diào)再也不會被調(diào)用话侧。
2、使用SimpleTarget<Bitmap>時闯参,需要為target指定一個尺寸
參考: Glide之Target
3瞻鹏、用 GlideModule自定義 Glide
- 實現(xiàn)GlideModule接口,全局改變 Glide 行為
public class ConfigurationGlide implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 設(shè)置別的get/set tag id鹿寨,以免占用View默認(rèn)的新博,Glide的3.6.0可以
ViewTarget.setTagId(R.id.glide_tag_id);
/*
內(nèi)存緩存
Glide提供了一個類MemorySizeCalculator,用于決定內(nèi)存緩存大小以及 bitmap 的緩存池脚草。
bitmap 池維護(hù)了你 App 的堆中的圖像分配赫悄。
正確的 bitmpa 池是非常必要的,因為它避免很多的圖像重復(fù)回收玩讳,這樣可以確保垃圾回收器的管理更加合理涩蜘。
它的默認(rèn)計算實現(xiàn)
*/
MemorySizeCalculator memorySizeCalculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
int defaultBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();
builder.setMemoryCache(new LruResourceCache((int) (defaultMemoryCacheSize*1.2f)));
builder.setBitmapPool(new LruBitmapPool((int) (defaultBitmapPoolSize * 1.2f)));
/*
磁盤緩存
Glide圖片緩存有兩種情況,一種是內(nèi)部磁盤緩存另一種是外部磁盤緩存熏纯。
我們可以通過 builder.setDiskCache()設(shè)置同诫,并且Glide已經(jīng)封裝好了兩個類實現(xiàn)外部和內(nèi)部磁盤緩存,
分別是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory
*/
//磁盤緩存100M樟澜,默認(rèn)250M
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,100*1024*1024));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
磁盤緩存可以位于應(yīng)用的私有目錄(除了它自己误窖,沒有別的應(yīng)用可以訪問),也可以位于外部存儲,不能一起設(shè)置這兩個
- 聲明:Glide 會掃描 AndroidManifest.xml 為 GlideModule 的 meta 聲明秩贰。
<meta-data android:name="com.hqgj.shareimgtransition.common.ConfigurationGlide" android:value="GlideModule"/>
參考: android學(xué)習(xí)之路(一)--Glide學(xué)習(xí)
盡量不要使用太大的圖片霹俺,一般頁面上圖片顯示多大就把圖片設(shè)置成多大,如果是后臺上傳的圖片毒费,可以使用組件把圖片生成縮略圖丙唧,如ASPJPEG上傳組件。
4觅玻、為不同的分辨率設(shè)備想际,加載不同尺寸的圖片
需要使用我們自己的ModeLoader(.using(new MyUrlLoader(this)))培漏,加載自己的數(shù)據(jù)源(.load(T model)),如下:
Glide.with(this).using(new MutImgUrlLoader(this))
.load(new MutImgDataModel() {
@Override
public String buildUrl(int width, int height) {
if(width>=1440){
return result.getImg()+ ThumbnailUtil.IMG1440;
}else if(width>=1080){
return result.getImg()+ThumbnailUtil.IMG1080;
}else if(width>=720){
return result.getImg()+ThumbnailUtil.IMG720;
}else if(width>=480){
return result.getImg()+ThumbnailUtil.IMG480;
}else {
return result.getImg()+ThumbnailUtil.IMG1080;
}
}
})
.asBitmap()
.transform(new GlideCircleTransform(this))
.error(R.mipmap.ic_launcher)
.animate(animator)
.into(new BitmapImageViewTarget(imageView){
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
}
});
實現(xiàn)自定義的ModelLoader胡本,繼承BaseGlideUrlLoader牌柄。
public class MutImgUrlLoader extends BaseGlideUrlLoader<MutImgDataModel> {
public MutImgUrlLoader(Context context) {
super(context);
}
@Override
protected String getUrl(MutImgDataModel model, int width, int height) {
return model.buildUrl(width,height);
}
}
自定義數(shù)據(jù)源:
public interface MutImgDataModel {
public String buildUrl(int width, int height);
}
這樣,我們在高分率的設(shè)備上加載大圖的url1侧甫,在低分辨率的設(shè)備上加載小圖url2珊佣。從而實現(xiàn)了根據(jù)不同手機(jī)上的像素值大小加載不同尺寸的圖片的需求。
參考:使用Glide加載圖片系列之一從不同的數(shù)據(jù)源加載圖片
5披粟、集成網(wǎng)絡(luò)庫
用 Glide 集成一個網(wǎng)絡(luò)庫咒锻,需要一個 Glide 的 ModeLoader 的接口。為了讓你更加易用僻爽,Glide 為2個網(wǎng)絡(luò)庫提供了實現(xiàn): OkHttp 和 Volley 虫碉。
Volley
dependencies {
...
// Glide
compile 'com.github.bumptech.glide:glide:3.6.1'
// Glide's Volley Integration
compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
compile 'com.mcxiaoke.volley:library:1.0.8'
}
這將添加 Volley 并集成該庫到你的項目中。集成庫添加GlideModule 到你的 Android.Manifest 胸梆。Glide 會自動認(rèn)出它敦捧,然后使用 Volley 作為網(wǎng)絡(luò)庫。并不要求做其他的配置碰镜!
6兢卵、取消緩存
取消內(nèi)存緩存(在主線程中調(diào)用)
Glide.get(this).clearMemory();
7、在listview中加載高度不固定圖片绪颖,加載刷新圖片跳動解決秽荤?
為啥高度不固定的時候會閃爍呢,應(yīng)該跟圖片高度不同有關(guān)柠横,在更新listview時候窃款,會去重新計算listview高度,繪制item牍氛,不同高度圖片會重新計算.
8晨继、-實現(xiàn)滾動加載,不滾動時不加載
Glide.with(context).resumeRequests()/Glide.with(context).pauseRequests()
參考:
Android圖片庫--Glide Wiki中文翻譯搬俊、圖片加載框架Glide解析紊扬、對比Picasso內(nèi)存占用、Yelp app是如何使用Glide優(yōu)化圖片加載的唉擂、Glide的使用大法與內(nèi)傷治療方案