圖片加載庫Glide的入門使用
前言
在android開發如此盛行的今天,圖片加載一直是開發的一個要點,市面上的圖片加載庫也是層出不窮,選擇一個適合當前功能使用的圖片加載庫十分重要。
使用過的圖片加載庫
Universal Image Loader:最初開始使用的,足夠強大,包含各種各樣的配置,能滿足你各種需求。
Picasso: Square出品,能和OkHttp搭配使用,唯一不足的是不能加載Gif圖片。
Fresco:非死book出的,十分強大,然而功能過于繁雜,使用起來比較麻煩。
Glide:專注于平滑圖片加載,用于滾動時加載圖片時相當流暢。
Glide的使用
加載圖片:load()-Glide 做了不同的重載用來支持本地及網絡圖片的加載
- load(String string) string可以為一個文件路徑、uri或者url
- load(Uri uri) Uri類型
- load(File file) 文件
- load(Integer resourceId) 資源Id,R.drawable.xxx或者R.mipmap.xxx
- load(byte[] model) byte[]類型
- load(T model) 自定義類型
Glide.with(context).load(imageUrl).into(imageView);
Glide的with()方法不光支持Context,還支持Activity 和 Fragment,有一點很重要需要記住,就是傳入的context類型影響到Glide加載圖片的優化程度,Glide可以監視activity的生命周期,在activity銷毀的時候自動取消等待中的請求。但是如果你使用Application context,你就失去了這種優化效果。
加載網絡圖片時,placeholder(Drawable drawable) 或者 placeholder(int resourceId)設置等待時顯示的圖片 ;通過 error(Drawable drawable) 或者 error(int resourceId)設置圖片加載失敗時顯示的圖片。
Glide.with(mContext).load(url).placeholder(drawable).error(drawable).into(imgView);
Glide 提供了兩種縮放方式 :fitCenter()和 centerCorp()
Glide.with(mContext).load(url).fitCenter().into(imgView);
Glide.with(mContext).load(url).centerCrop().into(imgView);
縮放方式不多做介紹,其與scaleType 中的 fitCenter/centerCorp效果是一樣的。
加載Gif圖片
Glide.with(context).load(imageUrl).asGif().placeholder(drawable).error(drawable).into(imageView);
asGif() 方法判斷所要加載的圖片是否為 gif圖,如果是則正常加載,如果不是則調用error()。也可以無需調用asGif() ,直接加載gif。
圖片緩存
Glide 提供了多種不同的緩存策略,例如:skipMemoryCache(boolean skip) 判斷是否直接跳過內存緩存
Glide.with(context).load(imageUrl).skipMemoryCache(true).into(imageView);
同時,對于磁盤緩存也做了多種擴展:
- DiskCacheStrategy.NONE 不做磁盤緩存
- DiskCacheStrategy.SOURCE 只緩存圖像原圖
- DiskCacheStrategy.RESULT 只緩存加載后的圖像,即處理后最終顯示時的圖像
- DiskCacheStrategy.ALL 緩存所有版本的圖像(默認行為)
調用diskCacheStrategy(DiskCacheStrategy strategy)設置磁盤緩存
Glide.with(context).load(imageUrl).diskCacheStrategy(strategy).into(imageView);
圖片加載優先級設定
Glide 引入優先級概念,提供了多種優先級設定:
- Priority.LOW
- Priority.NORMAL (默認優先級)
- Priority.HIGH
- Priority.IMMEDIATE
調用priority(Priority priority) 指定優先級
Glide.with(context).load(imageUrl).priority(priority).into(imageView);
Bitmap 的獲取
Glide.with(mContext)
.load(url)
.placeholder(drawable)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap)
}
};
Glide 擴展使用
定義圓形圖片加載
//圓形轉換
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();
}
}</code></pre>
調用transform(Transformation... transformations) 方法完成轉換
Glide.with(this).load(imageUrl).transform(new GlideCircleTransform(context)).into(imageView);
圓角圖片加載
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) {
this(context,15);
}
public GlideRoundTransform(Context context, int dp) {
super(context);
GlideRoundTransform.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);
}
}</code></pre>
使用方式與圓形相同。
當列表快速滑動時,暫停請求:pauseRequests()
Glide.with(context). pauseRequests();
當列表停止滑動時,重新請求:resumeRequests()
Glide.with(context).resumeRequests();
快速取消所有圖片請求:clear()
Glide.with(context). clear();
使用過程中遇到的問題
當Glide用于將圖片加載到自定義的Imageview時,需要設置占位圖,加載的圖片無法顯示。
網上有很多解決方案,這里說一個我發現的一個簡單方法: 設置一個顯示動畫 ,這樣就可以了,原因這里我就不詳細深究了。
Glide.with(context).load(imageUrl).placeholder(drawable)
.animate(R.anim.abc_fade_in).into(imgView);
來自:http://www.jianshu.com/p/d987f1a7f409