圖片載入控制元件Glide的使用
阿新 • • 發佈:2019-02-09
Glide是一款bumptech釋出,並被Google推薦使用的圖片載入庫。專案地址是https://github.com/bumptech/glide,本文不會對Glide的記憶體佔用和效能進行分析,只是介紹Glide的基本用法。
匯入庫
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
基本操作
Glide.with(context) //關聯activity或fragment的生命週期
.load(url) //載入地址(url,資源id,本地圖片file)
.placeholder(id) //未載入時的佔位圖
.error(id) //載入失敗時的佔位圖
.into(ImageView); //載入物件
基本配置
Glide的配置是通過實現GlideModule介面來設定。
public class MyGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
然後需要在AndroidManifest.xml中宣告
<meta-data
android:name="com.shangbang.store.base.MyGlideModule"
android:value="GlideModule" />
由於Glide是通過反射將GlideModule例項化得,所以需要在混淆檔案中加入
-keep public class * implements com.bumptech.glide.module.GlideModule
接下來介紹一些Glide的常用配置
- 配置圖片本地快取位置和本地快取大小
public void applyOptions(final Context context, GlideBuilder builder) {
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
//快取的資料夾
File cacheLocation = new File(context.getExternalCacheDir(), "glide");
if (!cacheLocation.exists())
cacheLocation.mkdirs();
return DiskLruCacheWrapper.get(cacheLocation, 250 * 1024 * 1024);//本地快取的大小
}
});
}
- 設定解碼格式
Glide預設的採用的使RGB_565,如果你對圖片的質量要求較高可以採用ARGB_8888格式,缺點是ARGB_8888的記憶體佔用是RGB_565的兩倍。此外,ARGB_8888是支援透明格式的,而RGB_565不支援。
有時候發現白色的圖片變成淡綠色,可以採用ARGB_8888格式來解決這個問題。
public void applyOptions(final Context context, GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
特殊要求的使用
- 快取策略
.diskCacheStrategy(Type) //設定快取到本地的策略
DiskCacheStrategy.NONE //不會快取到本地
DiskCacheStrategy.SOURCE //只快取原圖
DiskCacheStrategy.RESULT //只快取最終影象(預設)
DiskCacheStrategy.ALL //快取所有影象
在這裡有一個問題,有時候會發現當正常使用Glide時,Glide.with(context).load(url).into(imageView); 可能會導致原來的圖片白色變成淡綠色,可以選擇設定DiskCacheStrategy.SOURCE來解決這個問題。
- 圖片格式設定
Glide中給了兩種圖片的放入格式,需要注意的是使用Glide的圖片格式時就不要在ImageView中設定scaleType了,否則可能會使Glide的圖片格式失效。
.centerCrop() //自適應控制元件大小
.fitCenter() //適應圖片大小
- 載入優先順序
.priority(TYPE) //優先順序由低到高
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
- 縮圖
Glide.with(this)
.load("http://my.csdn.net/uploads/201205/06/1336311585_2632.gif")
.thumbnail(0.1f)
.into(iv);
利用thumbnail(0.1f)來設定先載入0.1f的縮圖顯示,然後再載入需要的圖
縮圖
原圖
- 自定義圖片轉化
這裡以製作圓形頭像為例介紹.transform()的使用
Glide.with(context)
.load(url)
.transform(new CircleTransform(context))
.into(imageView);
public class CircleTransform extends BitmapTransformation {
public CircleTransform(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) {
int size = Math.min(source.getWidth(), source.getHeight());
int width = (source.getWidth() - size) / 2;
int height = (source.getHeight() - size) / 2;
Bitmap bitmap = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader =
new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
if (width != 0 || height != 0) {
// source isn't square, move viewport to center
Matrix matrix = new Matrix();
matrix.setTranslate(-width, -height);
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return bitmap;
}
@Override
public String getId() {
return getClass().getName();
}
}
- 回撥bitmap
private SimpleTarget target = new SimpleTarget<Bitmap>( 250, 250 ) { //250,250可不加,表示原圖大小
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
imageView2.setImageBitmap( bitmap );
}
};
Glide
.with( context.getApplicationContext() ) // safer!
.load( url )
.asBitmap()
.into( target );
利用這種方法可以直接獲得bitmap,然後可以根據需要對Bitmap進行處理