圖片加載庫Glide的入門使用

BriSCN 8年前發布 | 8K 次閱讀 Bitmap 安卓開發 Android開發 移動開發

前言

在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

 

 本文由用戶 BriSCN 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!