前言:
在平常的開發中作爲開發人員的我們難免會遇到一些從服務器獲取圖片加載到控件上的操作,中所周知的Android中爲每個APP分發的內存是有限的,可是隨着當我們需要加載的圖片慢慢的多了的時候就需要考慮到內存溢出的問題,當一個APP內存佔用太大以至於大於等於這個APP所擁有的內存的時候就會出現卡頓甚至崩潰的問題。那麼作爲開發人員的我們又需要怎麼對這些圖片進行相應的處理才能解決這些問題?當然作爲一個開發人員來講,我們可以自己實現對這些圖片的緩存——也就是所謂的三級緩存;但是Google也向我們推薦一些圖片加載的框架,比如Picasso,Glide.ImageLoader這些用於圖片加載的框架,今天就簡單的介紹一下Glide這個加載框架在日常開發中的應用
先來說說使用步驟:
步驟一:引用
首先在APP的build.gradle文件下引入Glide
compile 'com.github.bumptech.glide:glide:3.6.1'
步驟二:使用
Glide.with(getContext())
.load(url)
.listener(mRequestListener)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(Drawables.sPlaceholderDrawable)
.error(Drawables.sErrorDrawable)
.into(mImageView)
解讀一下這裏面需要的參數:with(上下文) 這個上下文可以是當前activity或者是fragment的上下文,所以Glide也就支持了在activity或者fragment中使用;load(圖片的網址URL):在使用的時候只需要把獲取的圖片的網址放進去就可以了(必需);Listener:這個參數呢是爲加載圖片提供的配置監聽器的,在這裏可以實現一些自己的特定的需求;.diskCacheStrategy():這個參數呢是設置磁盤緩存的內容,這裏提供了四個參數供我們選擇all:緩存源資源和轉換後的資源;none:不作任何磁盤緩存;source:緩存源資源;result:緩存轉換後的資源;Placeholder:設置加載時候的圖片;error:設置加載失敗的圖片;into:設置顯示到那個控件上面
以上呢就是Glide在加載圖片的時候的一些基本的使用,接下來就說說使用Glide怎麼實現加載一張圓角或者圓形的圖片:
先貼出Glide加載網絡圖片轉換爲圓角的方法
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 4);
}
public GlideRoundTransform(Context context, int dp) {
super(context);
this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override public String getId() {
return getClass().getName() + Math.round(radius);
}
}
使用方法:
glideRequest.load(urlg").transform(new GlideRoundTransform(context)).into(imageView);
glideRequest.load(url
).transform(new GlideRoundTransform(context, 10)).into(imageView);
以下是加載圖片轉換爲圓形圖片的方法:
public class GlideCircleTransform extends BitmapTransformation {
public GlideCircleTransform(Context context) {
super(context);
}
@Override protected Bitmap transform(BitmapPool pool, 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;
// TODO this could be acquired from the pool too
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 String getId() {
return getClass().getName();
}
}
使用方法:
private RequestManager glideRequest;
glideRequest = Glide.with(context);
glideRequest.load(url).transform(new GlideCircleTransform(context)).into(imageView);
以上就是Glide加載圓角圖片以及實現圓形圖片的方法
接下來看看怎麼使用Glide實現加載一張GIF動畫圖片:
Glide.with(context).load(url).asBitmap()/asGif().into(imageview);
asBitmap和asGif的區別呢就是一個是靜態和一個是動態
當然Glide也支持了從本地獲取文件來加載圖片
最後說一點Glide自己的認知和了解:Glide默認的Bitmap的格式呢是ARGB_565,當然這個框架開發的時候就已經很人性化了,你要是覺得這個格式加載出來的質量你覺得不爽的話也可以改的。