Glide使用总结

Glide之前一直用的是3.7版本,但是后面在使用的过程中经常遇到各种各样的奇葩问题,解决问题需要花很长时间去百度谷歌,因此将自己日常使用的方法记录下来,下次就可以直接ctrl+C了,,,,,

  1. 集成
  2. 混淆
  3. 用法介绍
  • 集成
repositories {
  mavenCentral()
  google()
}

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.6.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
}
  • 混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
  • 用法介绍
    基本用法同3.7版本一致,代码如下:
Glide.with(this).load(url).into(imageView);
  • 添加占位图
RequestOptions options = new RequestOptions()
        .placeholder(R.drawable.loading);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 关闭磁盘缓存
RequestOptions options = new RequestOptions()
        .placeholder(R.drawable.loading)
        .diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);

占位图+异常图+磁盘缓存

RequestOptions options = new RequestOptions()
        .placeholder(R.drawable.ic_launcher_background)
        .error(R.drawable.error)
        .diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 指定图片资源大小
RequestOptions options = new RequestOptions()
        .override(300, 400);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 加载原图大小 图片不被压缩
RequestOptions options = new RequestOptions()
        .override(Target.SIZE_ORIGINAL);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 禁用内存缓存
RequestOptions options = new RequestOptions()
        .skipMemoryCache(true);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 禁用磁盘缓存:

  • DiskCacheStrategy.NONE: 表示不缓存任何内容

  • DiskCacheStrategy.DATA: 表示只缓存原始图片
  • DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片
  • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片
  • DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)
RequestOptions options = new RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);
  • 指定加载格式
    (默认自动加载图片格式,如加载gif动图)
Glide.with(this)
     .load("http://guolin.tech/test.gif")
     .into(imageView);
  • 指定静态图片
Glide.with(this)
     .asBitmap()
     .load("http://guolin.tech/test.gif")
     .into(imageView);
  • 获取图片资源

只获取图片资源(res图片、file图片、服务端图片),不加载到视图上
备注:SimpleTarget的泛型可变,比如BitmapDrawable等

SimpleTarget simpleTarget = new SimpleTarget() {
    @Override
    public void onResourceReady(Drawable resource, Transitionsuper Drawable> transition) {
        imageView.setImageDrawable(resource);
    }
};

public void loadImage(View view) {
    Glide.with(this)
         .load("http://guolin.tech/book.png")
         .into(simpleTarget);
}
  • 获取图片文件对象

submit()方法同上面代码的效果类似,就是下载图片文件(得到是图片文件,而非图片资源对象),且必须要用在子线程当中,因为FutureTarget的get()方法是会阻塞线程的。(注意避免内存泄漏,尽量使用ApplicationContext)
submit()方法是用于下载原始尺寸的图片,而submit(int width, int height)则可以指定下载图片的尺寸。

String url = "http://www.guolin.tech/book.png";
                final Context context = getApplicationContext();
                FutureTarget<File> target = Glide.with(context)
                        .asFile()
                        .load(url)
                        .submit();
                final File imageFile = target.get();
  • 预加载

跟获取图片资源类似,只是前者可获得图片资源,而预加载是不获取图片资源
备注:preload()方法有两个方法重载,一个不带参数,表示将会加载图片的原始尺寸,另一个可以通过参数指定加载图片的宽和高。

Glide.with(this)
     .load("http://guolin.tech/book.png")
     .preload();
  • listener()方法

    listener()方法的作用非常普遍,它可以用来监听Glide加载图片的状态。举个例子,比如说我们上面使用了preload()方法来对图片进行预加载,但是我怎样确定预加载有没有完成呢?还有如果Glide加载图片失败了,我该怎样调试错误的原因呢?答案都在listener()方法当中。
    下面来看下listener()方法的基本用法吧,不同于刚才几个方法都是要替换into()方法的,listener()是结合into()方法一起使用的,当然也可以结合preload()方法一起使用。

备注:onResourceReady()方法和onLoadFailed()方法都有一个布尔值的返回值,返回false就表示这个事件没有被处理,还会继续向下传递,返回true就表示这个事件已经被处理掉了,从而不会再继续向下传递,用事件分发机制的属于叫做消费了当前的事件。

Glide.with(this)
     .load("http://www.guolin.tech/book.png")
     .listener(new RequestListener() {
         @Override
         public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
             return false;
         }

         @Override
         public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
             return false;
         }
     })
     .into(imageView);
  • 图片变换
RequestOptions options = new RequestOptions()
        .centerCrop();

RequestOptions options = new RequestOptions()
        .fitCenter();

RequestOptions options = new RequestOptions()
        .circleCrop();

        Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);

自定义图片变换

public class CircleCrop extends BitmapTransformation {

    public CircleCrop(Context context) {
        super(context);
    }

    public CircleCrop(BitmapPool bitmapPool) {
        super(bitmapPool);
    }

    @Override
    public String getId() {
        //保证该字段的唯一
        return "com.example.glidetest.CircleCrop";
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
    //transform 自定义
        int diameter = Math.min(toTransform.getWidth(), toTransform.getHeight());

        final Bitmap toReuse = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888);
        final Bitmap result;
        if (toReuse != null) {
            result = toReuse;
        } else {
            result = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888);
        }

        int dx = (toTransform.getWidth() - diameter) / 2;
        int dy = (toTransform.getHeight() - diameter) / 2;
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, 
                                            BitmapShader.TileMode.CLAMP);
        if (dx != 0 || dy != 0) {
            Matrix matrix = new Matrix();
            matrix.setTranslate(-dx, -dy);
            shader.setLocalMatrix(matrix);
        }
        paint.setShader(shader);
        paint.setAntiAlias(true);
        float radius = diameter / 2f;
        canvas.drawCircle(radius, radius, radius, paint);

        if (toReuse != null && !pool.put(toReuse)) {
            toReuse.recycle();
        }
        return result;
    }
}

总结

前两天,我开发登录页的时候,遇到图片验证码刷新,发现每次都是加载的图片完全一样的,并没有完成刷新(图片url一样)!一看这个情形我就知道,是Glide自动缓存的“功劳”,但是百度了好久,测试都不行,如常见的方法:

GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(view);

最后发现代码编译并未生成GlideApp对象,按照网上的方法继承、Clean等等操作半天,结果还是并未实现。
后来通过在QQ群请教,得到了正确而简洁的方法:

RequestOptions options = new RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);

后来我再次请教对方这个知识点的来源,结果是来自郭神的专栏Glide的全面解析,而这个专栏自己是知道的,并在第二章看了不止五次(当然,还是说不出这篇文章的脉络的),但是后面的文章并未来得及拜读。最后,自己将整个专栏挑着阅读了一遍,对自己比较感兴趣的缓存、图片变换等章节细细品味,觉得收获颇大。而本文的所有知识点均来自郭神的Glide最全解析第八章Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

你可能感兴趣的:(日常总结)