轉(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的方式試其失效并重新下載,但不可以刪除)