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