关于Glide 看这一篇就够了

Google推荐的图片加载库,专注于流畅的滚动。

至于Glide的优点大家可以看我另外一篇博客
下面就直接开始Glide的使用

compile 'com.github.bumptech.glide:glide:3.7.0'

然后在需要使用加载图片的地方加入

Glide.with(mContext) 
     .load(path)
     .asGif()
     .override(200,200)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .placeholder(R.mipmap.loading_image)
     //.thumbnail(1f)
     .crossFade() 
     .error(R.mipmap.error)
     .transform(new GlideCircleTransform(mContext))
     .into(mImageView);

其中的方法根据自己需要选择使用,是不是觉得很简单呢

  • with() 传入对象 Context,Activity,Fragment,Glide会与当前传入值的生命周期一致。
  • load() 对象: String(文件路径,网络地址),File(文件资源),Integer(资源id)。
  • asGif() 表示的gif动画,asBitmap:表示静态图。
  • diskCacheStrategy() 表示磁盘缓存策略。
    1.DiskCacheStrategy.RESULT:展示小大的图片缓存
    2.DiskCacheStrategy.ALL; 展示在控件中大小图片尺寸和原图都会缓存
    3.DiskCacheStrategy.NONE:不设置缓存
    4.DiskCacheStrategy.SOURCE:原图缓存
  • override() 设置图片的width,height
  • placeholder() 设置占位图
  • error() 设置失败图
  • thumbnail() 缩略图显示传入值(0-1f)
  • crossFade() 显示动画-淡入淡出
  • transform() 设置图片圆角或圆形显示(继承 BitmapTransformation)这都是很常用的哦
  • centerCrop() 图片显示类型 fitCenter();
  • into() 显示到ImageView上

Glide使用案例

  1. 简单的加载图片实例
    Glide.with(this).load(imageUrl).into(imageView);
  2. 设置加载中以及加载失败图片
    Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
  3. 设置跳过内存缓存
    Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
  4. 设置下载优先级
    Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
  5. 设置缓存策略
    Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
  6. 设置加载动画
    Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
    R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <alpha 
        android:duration="500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>
  1. 设置缩略图支持
    Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
  2. 设置监听请求接口
Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
             return false;
        }
        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,  boolean isFromMemoryCache, boolean isFirstResource) {
            //imageView.setImageDrawable(resource);
            return false;
        }
 }).into(imageView);
  1. 设置动态转换—显示圆角图/原形图
    — 圆形图
/**
 * Glide-所使用显示圆形图片的转换类
 */
static 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 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;
        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();
    }
}

然后Glide.with(this).load(imageUrl).transform(new GlideCircleTransform(this)).into(imageView);

— 圆角图

/**
 * Glide-显示圆角图片的转换类
 */
static class GlideRoundTransform extends BitmapTransformation {
    private float radius = 0f;
    public GlideRoundTransform(Context context) {
        this(context, 4);
    }
    public GlideRoundTransform(Context context, int radiusDp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * radiusDp;
    }
    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
    }
    private 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);
    }
}

然后Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);

使用建议–务必要自己写个ImageLoader类,例如

/** 
 * 全局的Image显示管理--Glide 
 * Created by 王元_Trump on 2016/1/24. 
 */
public class ImageLoader {
    public static final String ANDROID_RESOURCE = "android.resource://";
    public static final int IMAGE_LOADING = R.color.light_gray;   //loading占位图
    public static final int IMAGE_ERROR = R.color.light_gray;  //error图
    // 将资源ID转为Uri
    public static Uri resourceIdToUri(Context mContext, int resourceId) {
        return Uri.parse(ANDROID_RESOURCE + mContext.getPackageName() + "/" + resourceId);
    }    
// 加载网络图片
    public static void displayByUrl(Context mContext, String url, ImageView imageView) {
        Glide.with(mContext)
                .load(url)
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()   //淡入淡出
                .into(imageView);
    }
    // 加载drawable图片
    public static void displayByRes(Context mContext, int resId, ImageView imageView) {
        Glide.with(mContext)
                .load(resourceIdToUri(mContext, resId))
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()
                .into(imageView);
    }
    // 加载本地图片
    public static void displayByLocal(Context mContext, String path, ImageView imageView) {
        Glide.with(mContext)
                .load("file://" + path)
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()
                .into(imageView);
    }
}
设置Glide显示的Bitmap格式,默认是RGB_565
第一步
public class GlideConfiguration implements GlideModule {
   @Override
   public void applyOptions(Context context, GlideBuilder builder) {
     //设置图片的显示格式ARGB_8888
     builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
     //设置磁盘缓存目录
     //StringdownloadDirectoryPath=Environment.getExternalStorageDirectory() +Contents.MY_GLIDE_DISK;
     //int cacheSize100MegaBytes = 100000000;
     //glideBuilder.setDiskCache( new DiskLruCacheFactory(downloadDirectoryPath, cacheSize100MegaBytes) );
   } 
  @Override
  public void registerComponents(Context context, Glide glide) {
     // register ModelLoaders here.
  }
 } 
第二步

在AndroidManifest.xml中定义meta-data

<meta-data
 android:name=".config.GlideConfiguration"
 android:value="GlideModule"/>

Glide使用中常见的问题

一、为什么 有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片呢?

  • 方案一: 不设置占位
  • 方案二:使用如下的代码加载图片:
Glide.with(mContext)
    .load(url) 
    .placeholder(R.drawable.loading_spinner)
    .into(new SimpleTarget<Bitmap>(width, height) {
        @Override 
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
            // setImageBitmap(bitmap) on CircleImageView 
        } 
    };
  • 方案三:使用Glide的Transformation API自定义圆形Bitmap的转换。(如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话)

二、为什么会偶尔看到类似于”You cannot start a load for a destroyed activity”的异常呢?

  • 当你的图片还在loaidng, 或者你在asynctask里面的 post 里去 加载图片,当async 还在跑时, 你back, finish 了你的activity,那么就报错了。所以请记住一句话: 不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext()。这里是解决方案

另外Glide还提供了清除缓存的实现

  • Glide.get(context).clearDiskCache();(清除磁盘缓存) 必须在子线程
  • Glide.get(context).clearMemory();(清除内存缓存) 必须在主线程
    原文作者:王元_Trump
    原文地址: https://www.jianshu.com/p/e78407a18716
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞