Glide 基本用法

  1. 添加依赖
    1
    2
    3
    4
    5
    6
    dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
    }
    //implementation 'com.github.bumptech.glide:glide:4.4.0'
    //这个版本的需要SDK version 27.0.2
    <uses-permission android:name="android.permission.INTERNET" />
  1. 在代码中使用:

    1
    Glide.with(this).load(url).into(imageView);
  2. 加载其他的图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 加载本地图片
    File file = new File(getExternalCacheDir() + "/image.jpg");
    Glide.with(this).load(file).into(imageView);
    // 加载应用资源
    int resource = R.drawable.image;
    Glide.with(this).load(resource).into(imageView);
    // 加载二进制流
    byte[] image = getImageBytes();
    Glide.with(this).load(image).into(imageView);
    // 加载Uri对象
    Uri imageUri = getImageUri();
    Glide.with(this).load(imageUri).into(imageView);
  3. 占位图

    1
    2
    3
    4
    Glide.with(this)
    .load(url)
    .placeholder(R.drawable.loading)
    .into(imageView);
  4. 缓存策略

    1
    2
    3
    4
    5
    Glide.with(this)
    .load(url)
    .placeholder(R.drawable.loading)
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .into(imageView);
  5. 错误图片

    1
    2
    3
    4
    5
    6
    Glide.with(this)
    .load(url)
    .placeholder(R.drawable.loading)
    .error(R.drawable.error)
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .into(imageView);
  6. 加载圆 Transformer

    要在 ImageView 中去设置 scaleType 为 centerCrop。但是,当你同时给图片设置圆角类 Transformer 时,即在 Glide 加载图片时给 .transform() 配置了一个圆角矩形,如果同时 ImageView 的 scaleType 设置了 centerCrop,那圆角就没有了。

  • 解决办法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    ...
    .transform(new CenterCrop(getContext())
    ,new GlideRoundTransform(getContext(), 25))
    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);
    }
    }
  1. 缓存

    缓存参数说明

  • DiskCacheStrategy.NONE:不缓存任何图片,即禁用磁盘缓存
  • DiskCacheStrategy.ALL :缓存原始图片 & 转换后的图片(默认)
  • DiskCacheStrategy.SOURCE:只缓存原始图片(原来的全分辨率的图像,即不缓存转换后的图片)
  • DiskCacheStrategy.RESULT:只缓存转换后的图片(即最终的图像:降低分辨率后 / 或者转换后 ,不缓存原始图片
1
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
  1. 加载圆角

    1
    2
    3
    Glide.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView);
    Glide.with(this).load(url).bitmapTransform(new RoundedCornersTransformation(this, 30, 0, RoundedCornersTransformation.CornerType.BOTTOM)).crossFade(1000).into(image5);
  2. 高斯模糊

    需要引入 高斯模糊库

    1
    2
    3
    4
    5
    6
    7
    8
    Glide.with(MusicPlayerActivity.this)
    .load(service.getImageUri())
    .dontAnimate()
    .error(R.drawable.no_music_rotate_img)
    // 设置高斯模糊
    // “14”:设置模糊度(在0.0到25.0之间),默认”25";"3":图片缩放比例,默认“1”。
    .bitmapTransform(new BlurTransformation(this, 14, 3))
    .into(allBg);

使用Glide的Tips

  1. 列表预加载
    如果你想让列表预加载的话,不妨试一下ListPreloader这个类。
  2. 列表滑动时取消请求
    当列表在滑动的时候,调用 pauseRequests() 取消请求,滑动停止时,调用 resumeRequests() 恢复请求。

    1
    2
    Glide.with(context).resumeRequests()
    Glide.with(context).pauseRequests()
  3. 清除所有加载请求
    当你想清除掉所有的图片加载请求时,可以使用 Glide.clear() 这个方法。

  4. Glide特效转换库
    glide-transformations 一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果。
  5. Palette 库
    GlidePalette 一个在Glide加载时很方便使用Palette的库。GitHub - florent37/GlidePalette: Android Lollipop Palette is now easy to use with Glide
  6. 不要再非主线程里面使用 Glide 加载图片,如果真的使用了,请把 context 参数换成 getApplicationContext。
  7. Glide图片和默认图交替过程中,默认图闪烁一下
    解决方法:
    去掉动画:dontAnimate()