學(xué)習(xí)于:https://bumptech.github.io/glide/
http://blog.csdn.net/u013005791/article/details/74532091
GlideV4中如
centerCrop()
废离,placeholder()
等方法已經(jīng)不能直接通過流式API的方式調(diào)用端礼;
如果還是想通過V3版本的方式調(diào)用婶溯,官方也提供了一種解決方案:添加依賴
repositories {
mavenCentral()
}
dependencies {
compile 'com.github.bumptech.glide:glide:4.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
compile 'com.android.support:support-v4:25.3.1'
}
并且創(chuàng)建一個AppGlideModule
的實(shí)現(xiàn)類蜀肘,之后Rebuild工程,然后就能找到GlideApp
對象了旱爆,然后就可以和Glide v3一樣使用了黔帕;
AppGlideModule
如果注釋不存在鄙信,則不會發(fā)現(xiàn)該模塊,并且您將在日志中看到一條帶有Glide日志標(biāo)記的警告瓤的,該日志標(biāo)記指示該模塊無法找到休弃。
接下來將在V4基礎(chǔ)上重新學(xué)習(xí)Glide的用法;
-
RequestOptions
Glide中的大多數(shù)設(shè)置都可以使用RequestOptions
類和apply()
方法來應(yīng)用圈膏;
/**
* 磁盤緩存策略:diskCacheStrategy(DiskCacheStrategy.NONE)
*
* DiskCacheStrategy.ALL 使用DATA和RESOURCE緩存遠(yuǎn)程數(shù)據(jù)塔猾,僅使用RESOURCE來緩存本地數(shù)據(jù)。
* DiskCacheStrategy.NONE 不使用磁盤緩存
* DiskCacheStrategy.DATA 在資源解碼前就將原始數(shù)據(jù)寫入磁盤緩存
* DiskCacheStrategy.RESOURCE 在資源解碼后將數(shù)據(jù)寫入磁盤緩存稽坤,即經(jīng)過縮放等轉(zhuǎn)換后的圖片資源桥帆。
* DiskCacheStrategy.AUTOMATIC 根據(jù)原始圖片數(shù)據(jù)和資源編碼策略來自動選擇磁盤緩存策略。
*/
/**
* 優(yōu)先級:priority(Priority.HIGH)
*
* Priority.LOW
* Priority.NORMAL
* Priority.HIGH
* Priority.IMMEDIATE
*/
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.fallback(R.mipmap.ic_launcher)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.priority(Priority.HIGH)
.override(800,800)
.circleCrop();
// .transform(new GlideRoundTransform (context))
// .centerInside();
// .centerCrop();
Glide.with(this)
.load(R.mipmap.gifpic)
.apply(options)
.into(imageView);
**清除緩存**:
//清理磁盤緩存 需要在子線程中執(zhí)行
Glide.get(this).clearDiskCache();
//清理內(nèi)存緩存 可以在UI主線程中進(jìn)行
Glide.get(this).clearMemory();
apply:應(yīng)用ResquestOptions
對象慎皱,該方法可以調(diào)用多次老虫,但是如果兩次apply存在沖突的設(shè)置,會以最后一次為準(zhǔn)茫多;
placeholder(占位符):當(dāng)請求成功完成時祈匙,占位符將被替換為請求的資源。如果從內(nèi)存中加載所請求的資源,則占位符可能永遠(yuǎn)不會顯示夺欲。如果請求失敗跪帝,并且未設(shè)置error()
,占位符將繼續(xù)顯示些阅。類似地伞剑,如果所請求的url / model是null并且既不設(shè)置error()
也不是fallback()
,則占位符也將繼續(xù)顯示市埋;
占位符是從Android資源在主線程上加載的黎泣,所以盡可能是小的容易緩存的資源;
error:當(dāng)請求永久失敗時顯示缤谎。如果所請求的url / model是null并且沒有設(shè)置fallback()
抒倚,則也顯示;
fallback:當(dāng)請求的url / model是null的時候坷澡,顯示fallback()
設(shè)置的資源托呕;
CenterCrop:縮放寬和高都到達(dá)View的邊界,有一個參數(shù)在邊界上频敛,另一個參數(shù)可能在邊界上项郊,也可能超過邊界;
CenterInside :如果寬和高都在View的邊界內(nèi)斟赚,那就不縮放呆抑,否則縮放寬和高都進(jìn)入View的邊界,有一個參數(shù)在邊界上汁展,另一個參數(shù)可能在邊界上鹊碍,也可能在邊界內(nèi);
CircleCrop :圓形且結(jié)合了CenterCrop的特性食绿;
FitCenter:縮放寬和高都進(jìn)入View的邊界侈咕,有一個參數(shù)在邊界上,另一個參數(shù)可能在邊界上器紧,也可能在邊界內(nèi)耀销;
但是其實(shí)完全可以在layout文件中設(shè)置ImageView為android:scaleType="centerCrop"
,Glide會自動根據(jù)這個屬性設(shè)置圖片的顯示方式铲汪;
overrid:Glide 會根據(jù)ImageView的大小熊尉,自動限制圖片緩存和內(nèi)存中的大小,同時也可以調(diào)用override(width, height)限制圖片的大姓蒲狰住;
transform:自定義GlideRoundTransform
類實(shí)現(xiàn)圓角圖片;
/**
* Created by whstywh on 2017/4/5
* GitHub:https://github.com/whstywh
* email:whstywh@gmail.com
* description:自定義Glide圓角圖片類
*/
public class GlideRoundTransform extends BitmapTransformation {
public GlideRoundTransform(Context context) {
super(context);
}
/**
* 重寫 生成圓角圖片
*
* @param pool
* @param toTransform
* @param outWidth
* @param outHeight
* @return
*/
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
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;
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
}
}
-
TransitionOptions
有三種:
GenericTransitionOptions
DrawableTransitionOptions
BitmapTransitionOptions
為避免突然變化齿梁,您可以在圖像切換時設(shè)置淡入淡出催植;
Glide.with(this)
.load(R.mipmap.gifpic)
.apply(options)
.transition(DrawableTransitionOptions.withCrossFade())
// .transition(BitmapTransitionOptions.withCrossFade())
// .transition(GenericTransitionOptions.with())
.into(imageView);
TransitionOptions并且與Glide要加載的資源類型相關(guān)肮蛹;
因此,如果你要求Drawable创南,則需要使用交叉淡入淺出DrawableTransitionOptions.withCrossFade()
伦忠,如果您要求Bitmap,則需要使用簡單的淡入淡出BitmapTransitionOptions.withCrossFade()
稿辙;如果既不是Bitmap也不是Drawable可以使用GenericTransitionOptions
昆码;
如果要使用自定義的動畫,可以使用GenericTransitionOptions.with(int viewAnimationId)
或者BitmapTransitionOptions.withCrossFade(int animationId, int duration)
或者DrawableTransitionOptions.withCrossFade(int animationId, int duration)
邻储;
出于性能考慮赋咽,最好不要在ListView,GridView,RecycleView中使用過渡動畫,可以使用.dontAnimate()
不加載動畫:
RequestOptions options = new RequestOptions()
...
.dontAnimate()
- RequestBuilder
RequestBuilder<Drawable> requestBuilder = Glide.with(this)
.asGif()
// .asBitmap()
// .asDrawable()
// .asFile()
.load(R.mipmap.gifpic);
requestBuilder.thumbnail(0.1f)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
Log.d("flag", "onLoadFailed");
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
Log.d("flag", "onResourceReady");
return false;
}
})
.apply(options)
.transition()
.into(imageView);
with:方法相比Picasso而言不僅接受Context,還接受Activity芥备,F(xiàn)ragment冬耿,View舌菜;
加載GIF
如果使用了
.asGif()
方法萌壳,圖片會強(qiáng)制轉(zhuǎn)換成gif圖,此時傳入的圖片就必須是gif圖日月,否則會報錯袱瓮。當(dāng)然不使用.asGif()
方法同樣也可以加載gif圖;load:方法中可以傳入聯(lián)網(wǎng)請求的url爱咬,資源id尺借,F(xiàn)ile;相比Picasso還支持GIF圖精拟,本地MP4播放燎斩;
thumbnail:設(shè)置縮略圖,傳入一個(0,1)之間的float數(shù)值時蜂绎,表示縮略圖為原圖的十分之幾栅表,如果縮略圖比全尺寸圖先加載完,就顯示縮略圖师枣,否則就不顯示怪瓶;如果縮略圖也來自網(wǎng)絡(luò)獲取時,代碼如下:
requestBuilder.thumbnail(Glide.with(this).load(thumbnailUrl))
...
.into(imageView);
listener:監(jiān)聽資源加載的請求狀態(tài)践美,可以使用兩個回調(diào):onResourceReady
和onLoadFailed
洗贰,但不要每次請求都使用新的監(jiān)聽器,要避免不必要的內(nèi)存申請陨倡,可以使用單例進(jìn)行統(tǒng)一的異常監(jiān)聽和處理敛滋。
apply:應(yīng)用RequestOptions
transition:應(yīng)用TransitionOption
Recycle的加載優(yōu)化
只在拖動和靜止時加載,自動滑動時不加載兴革。
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_DRAGGING:
Glide.with(MainActivity.this).resumeRequests();//加載
break;
case RecyclerView.SCROLL_STATE_SETTLING:
Glide.with(MainActivity.this).pauseRequests();//暫停加載
break;
case RecyclerView.SCROLL_STATE_IDLE:
Glide.with(MainActivity.this).resumeRequests();//加載
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
- Glide和Picasso的區(qū)別
Glide默認(rèn)的Bitmap格式是RGB_565 矛缨,比 Picasso的ARGB_8888格式的內(nèi)存開銷要小一半。
Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實(shí)時重繪大小箕昭。而Glide加載的大小和ImageView的大小是一致的灵妨,因此內(nèi)存花銷更小。
Picasso和Glide在磁盤緩存策略上有很大的不同落竹。Picasso緩存的是全尺寸的泌霍,而Glide緩存的是跟ImageView尺寸相同的。
嘗試將ImageView調(diào)整成不同大小述召,但不管大小如何Picasso只緩存一個全尺寸的朱转。Glide則不同,它會為每種大小的ImageView緩存一次积暖。盡管一張圖片已經(jīng)緩存了一次藤为,但是假如你要在另外一個地方再次以不同尺寸顯示,則需要重新下載夺刑,調(diào)整成新尺寸的大小缅疟,然后將這個尺寸的也緩存起來。
另外Glide也可以既緩存全尺寸又緩存其他尺寸:
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
Glide的優(yōu)點(diǎn)是加載顯示非潮樵福快存淫。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致有一些延遲。