Glide是Andorid开发中使用的很广泛的一个图片加载库了。今天来看看Glide的用法。本文章基于最新版本4.6.1
首先gradle中导入依赖,下面是github上的写法
compile 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
Glide默认会导入Android的support-v4包。4.6.1版本默认导入的是v4包的27版本。如果你的项目中有v4包的别的版本,就会引起冲突发生错误如
java.lang.NoSuchMethodError: No static method
getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)Landroid/graph
ics/Typeface; in class Landroid/support/v4/content/res/ResourcesCompat; or its super classes
(declaration of 'android.support.v4.content.res.ResourcesCompat'
所以如果你项目中有别的版本的support包,需要跟Glide版本中的support包的版本号一致。或者用下面的吧Glide中的support包去掉,然后自己引入
dependencies {
implementation ("com.github.bumptech.glide:glide:4.6.1") {
exclude group: "com.android.support"//去掉glide中的support包
}
implementation "com.android.support:support-fragment:26.1.0"//引入你自己的support版本的
}
权限添加:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
//用于硬盘缓存和读取
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
最基本的用法很简单
String url = "http://p3.pstatp.com/origin/pgc-image/15220293999066398493c24";
Glide.with(this)
.load(url)
.into(imageView);
load方法中不仅可以传入图片地址,还可以传入图片文件File,resource,图片的byte数组等
Glide.with(this).load(file).into(imageView);
int resource = R.drawable.ic_launcher;
Glide.with(this).load(resource).into(imageView);
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
如果我们只想下载图片,不加载到view上,可以如下。submit()是线程阻塞的,需要在子线程中完成
new Thread(){
@Override
public void run() {
FutureTarget<File> futureTarget =
Glide.with(getApplicationContext())
.asFile()
.load(url)
.submit();
try {
File file= futureTarget.get();//得到图片下载后的file,然后可以自己去拿着它做别的事情了
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Glide.with(getApplicationContext()).clear(futureTarget);
}
};
FutureTarget可以指定返回的类型上面返回的File我们也可以返回Bitmap
new Thread(){
@Override
public void run() {
FutureTarget<Bitmap> futureTarget =
Glide.with(getApplicationContext())
.asBitmap()
.load(url)
.submit();
try {
Bitmap bitmap = futureTarget.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Glide.with(getApplicationContext()).clear(futureTarget);
}
};
Glide从4.0开始,使用的时候多了一个注解处理器 (Annotation Processor),主要用于我们自定义的时候自动生成一些类,帮助我们简化操作。或者定义一些全局的常用的方法。
自定义的方法:需要重写AppGlideModule
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
super.applyOptions(context, builder);
}
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);
}
}
我们不必去重写 AppGlideModule 中的任何一个方法。子类中完全可以不用写任何东西,它只需要继承 AppGlideModule 并且添加 @GlideModule 注解。这里我们重写了两个方法,后面只需要在applyOptions()和registerComponents()这两个方法中加入具体的逻辑,就能实现更改Glide配置或者替换Glide组件的功能了。
如果要使用我们自定义的module,定义玩上面的类后,Android Studio中点击菜单栏Build -> Rebuild Project重新编译然后代码中变为GlideApp开头
GlideApp.with(fragment)
.load(myUrl)
.placeholder(R.drawable.placeholder)
.fitCenter()
.into(imageView);
Glide中的大部分设置项都可以通过 RequestOptions 类和 apply() 方法来应用到程序中。
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.ic_launcher)//加载成功之前占位图
.error(R.mipmap.ic_launcher)//加载错误之后的错误图
.override(400,400)//指定图片的尺寸
//指定图片的缩放类型为fitCenter (等比例缩放图片,宽或者是高等于ImageView的宽或者是高。)
.fitCenter()
//指定图片的缩放类型为centerCrop (等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。)
.centerCrop()
.circleCrop()//指定图片的缩放类型为centerCrop (圆形)
.skipMemoryCache(true)//跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.ALL)//缓存所有版本的图像
.diskCacheStrategy(DiskCacheStrategy.NONE)//跳过磁盘缓存
.diskCacheStrategy(DiskCacheStrategy.DATA)//只缓存原来分辨率的图片
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)//只缓存最终的图片
;
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
如果使用了自定义的API,centerCrop(),fitCenter(),circleCrop()可以省略RequestOptions 这一步,更简单
GlideApp.with(this)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.centerCrop()
.fitCenter()
.circleCrop()
.override(400,400)
.into(imageView);
使用使用 TransitionOption 可以用于View淡入与占位符交叉淡入。
Glide.with(this)
.load(url)
.apply(options)
.transition(withCrossFade())//用于决定你的加载完成时会发生什么。(淡入淡出动画)
.into(imageView);
RequestBuilder 负责携带请求的url和你的设置项来开始一个新的加载过程。我们可以指定图片的加载的格式
Glide.with(this).asGif()//加载gif
Glide.with(this).asFile()//加载一个file
Glide.with(this).asBitmap()//加载bitmap
Glide.with(this).asDrawable()//加载drawable
如果我们的后台接口返回了缩略图的地址,我们可以使用缩略图的api(Thumbnail),缩略图 会在主请求加载过程中展示。如果主请求在缩略图请求之前完成,则缩略图请求中的图像将不会被展示。[thumbnail] API 允许我们简单快速地加载图像的低分辨率版本,并且同时加载图像的无损版本,这可以减少用户盯着加载指示器的时间。
Glide.with(this)
.load(url)//正常图的地址
.thumbnail(Glide.with(this)
.load(thumbnailUrl))//缩略图的地址
.into(imageView);
简化版
Glide.with(fragment)
.load(localUri)
.thumbnail(/*sizeMultiplier=*/ 0.25f)//尺寸为 View 或 Target 的某个百分比
.into(imageView);
最后一步init()方法。一般情况下我们都是传入一个ImageView来显示图片。我们不仅可以传入ImageView也可以传入一个Target对象。其实传入 ImageView 最终也是包装了一个合适的 ImageViewTarget。Target 是介于请求和请求者之间的中介者的角色。Target 负责展示占位符,加载资源,并为每个请求决定合适的尺寸。一般情况下我们使用传入ImageView的就好了。除非非得要自己定制。
Glide.with(this)
.load(url)
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
//这里就可以对resource随意处理了
imageView.setImageDrawable(resource);
}
});
OK,Glide的基本用法就会了。可以看到用起来非常简单,而且扩展性非常强。下一篇看一下Glide内部的执行流程。