Glide 4.x和3.x区别和使用介绍
基础使用
添加4.x版本的依赖
implementation 'com.github.bumptech.glide:glide:4.4.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
相比于Glide 3,这里要多添加一个compiler的库,这个库是用于生成Generated API的。
使用:
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.loading) //占位图
.error(R.drawable.error) //异常占位图
..override(200, 100)
.diskCacheStrategy(DiskCacheStrategy.NONE);//不进行磁盘缓存
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
相比于Glide 3.x,这个版本的主要变化是,将配置全部设置到了一个RequestOptions里面,并使用apply方法,应用这些配置信息。
缓存策略
Glide 4.x版本的缓存选项,有下面5种:
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.DATA: 表示只缓存原始图片。
DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
Glide 3中的语法是先load()再asBitmap()的,而在Glide 4中是先asBitmap()再load()的
Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载
Glide 4中又新增了submit()/submit(int width, int height)方法,这个方法其实就是对应的Glide 3中的downloadOnly()方法
public void downloadImage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
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();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
图片转换
Glide 4.x还提供了现成的图片转换的API:
RequestOptions options = new RequestOptions()
.centerCrop();
RequestOptions options = new RequestOptions()
.fitCenter();
RequestOptions options = new RequestOptions()
.circleCrop();
方便进行图片转换,如果需要使用一些特殊转换,需要调用
RequestOptions options = new RequestOptions()
.transform();
配合下面这个库:
dependencies {
implementation 'jp.wasabeef:glide-transformations:3.0.1'
}
就可以进行方便的进行图片转换。使用示例如下:
String url = "https://up.sc.enterdesk.com/edpic/cf/3e/84/cf3e8415383e065b0fe8938f73bedf70.jpg";
RequestOptions options = new RequestOptions()
.transforms(new BlurTransformation(), new GrayscaleTransformation());
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
GlideApp
Generated API是Glide 4中全新引入的一个功能,它的工作原理是使用注解处理器 (Annotation Processor) 来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中所有的选项,简单说,就是Glide 4仍然给我们提供了一套和Glide 3一模一样的流式API接口,照顾老版本的用户的使用习惯。只不过需要把Glide关键字替换成GlideApp关键字,如下所示:
GlideApp.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(Target.SIZE_ORIGINAL)
.circleCrop()
.into(imageView);
不过,有可能你的IDE中会提示找不到GlideApp这个类。这个类是通过编译时注解自动生成的,但是要先先准备代码中,有一个自定义的模块,并给这个模块加上 @GlideModule 注解。如下所示:
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
}
}
然后在Android Studio中点击菜单栏Build -> Rebuild Project,GlideApp这个类就会自动生成了。
自定义API
下面我来具体举个例子,比如说我们要求项目中所有图片的缓存策略全部都要缓存原始图片,那么每次在使用Glide加载图片的时候,都去指定diskCacheStrategy(DiskCacheStrategy.DATA)这么长长的一串代码,确实是让人比较心烦。这种情况我们就可以去定制一个自己的API了,定制自己的API需要借助 @GlideExtension 和 @GlideOption这两个注解。创建一个我们自定义的扩展类,代码如下所示:
@GlideExtension
public class MyGlideExtension {
private MyGlideExtension() {
}
@GlideOption
public static void cacheSource(RequestOptions options) {
options.diskCacheStrategy(DiskCacheStrategy.DATA);
}
}
这里我们定义了一个MyGlideExtension类,并且给加上了一个 @GlideExtension注解,然后要将这个类的构造函数声明成private,这都是必须要求的写法。接下来就可以开始自定义API了,这里我们定义了一个cacheSource()方法,表示只缓存原始图片,并给这个方法加上了 @GlideOption注解。注意自定义API的方法都必须是静态方法,而且第一个参数必须是RequestOptions,后面你可以加入任意多个你想自定义的参数。在cacheSource()方法中,我们仍然还是调用的diskCacheStrategy(DiskCacheStrategy.DATA)方法,所以说cacheSource()就是
一层简化API的封装而已。然后在Android Studio中点击菜单栏Build -> Rebuild Project,神奇的事情就会发生了,你会发现你已经可以使用这样的语句来加载图片了:
GlideApp.with(this)
.load(url)
.cacheSource()
.into(imageView);
推荐阅读
-
insert into select和select into的使用和区别介绍
-
Vue的watch和computed方法的使用及区别介绍
-
insert into select和select into的使用和区别介绍
-
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
-
perl中chomp的使用介绍(chop和chomp函数区别)
-
pcie4.0和3.0有什么区别 pcie4.0对比3.0使用区别介绍
-
C语言中的const和C++中的const区别及使用介绍
-
Jquery选择子控件大于号和 区别介绍及使用示例
-
asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
-
Jquery选择子控件"大于号"和" "区别介绍及使用示例_jquery