图片加载框架Glide的使用解析及其高级用法
1.Glide项目简介
2.普通图片加载方法与Glide图片加载对比
3.Glide的高级使用方法(一)
4.Glide的高级使用方法(二)
5.Glide使用常用方法
6.RequestOptions的常用配置
.
.
1.Glide项目简介
Glide在安卓中不算是一个新的技术,但却是使用的比较火热的图片加载框架。在GitHuB上有28.2K颗星也体现了广大开发者对Glide的喜爱.我们要使用Glide的话需要在依赖库中加入如下代码:
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
2.普通图片加载方法与Glide图片加载对比
2.1首先编写一个只有一个按钮和一个ImageView的布局,然后在Activity中绑定控件,开通网络权限等基本操作。
2.2用普通方法加载网络中的图片
/*
用普通方法加载网络中的图片给共分三步
1.找到图片地址
2.根据图片地址转化为可被加载的对象
3.通过imageView来加载图片
*/
private void loadImage(final String img)
{
//加载网络图片是耗时操作,需要新开线程
new Thread()
{
@Override
public void run() {
super.run();
Message message = Message.obtain();//从消息池取出的message
try {
//使用HttpURLConnection进行网络请求
URL url = new URL(img);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
int code = httpURLConnection.getResponseCode();
//如果请求成功
if (code == 200)
{
InputStream inputStream = httpURLConnection.getInputStream();
//将inputstream转换为可被加载的BitMap对象
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
message.what = 200;
message.obj = bitmap;
}
else
{
message.what = code;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
handler.sendMessage(message);//使用Handler将message发送出去
}
}
}.start();
}
//在Handlerzhong
private Handler handler = new Handler()
{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case 200:
{
//请求成功
Bitmap bitmap = (Bitmap) msg.obj;
imageView1.setImageBitmap(bitmap);
break;
}
default:
{
break;
}
}
}
};
2.3使用Glide加载网络中的图片
/*
1.调用.with方法来创建图片加载实例
2.调用.load方法选择图片来源
3.调用.into方法来配置图片载体
*/
private void glideLoadImage(String url)
{
//这段代码对图片进行了处理,可以不用使用
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.ic_launcher)//加载网络图片是显示的图片
.error(R.mipmap.ic_launcher)//请求出错的时候显示的图片
.circleCrop();//将图片变为圆形
//一般情况下只用下方的代码即可完成加载图片的需求
Glide.with(this)
.load(url)
.apply(options)
.into(imageView1);
}
通过对比两段代码我们可以一眼看出了使用了Glide后的代码变得更加的简洁简单。
3.Glide的高级使用方法(一)
在上面的代码中我们用了RequestOptions来配置加载的图片。但如果每加载一次图片就写一次RequestOptions也太麻烦了,所以我们就需要对RequestOptions进行封装。
public class GlideOptionsUtils
{
//生成一个基本的RequestOptions
public static RequestOptions baseOptionss()
{
return new RequestOptions()
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher);
}
//对基本的RequestOptions进行个性化处理
public static RequestOptions circleOptions()
{
return baseOptionss().circleCrop();
}
}
然后我们在原来的Glide使用的地方稍加修改即可:
private void glideLoadImage(String url)
{
//这段代码对图片进行了处理,可以不用使用
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.ic_launcher)//加载网络图片是显示的图片
.error(R.mipmap.ic_launcher)//请求出错的时候显示的图片
.circleCrop();//将图片变为圆形
//一般情况下只用下方的代码即可完成加载图片的需求
Glide.with(this)
.load(url)
**** .apply(GlideOptionsUtils.circleOptions())
.into(imageView1);
}
以后如果有别的新需求只要对baseOptions进行加工,生成一个新的方法即可。
4.Glide的高级使用方法(二)
Glide给我们了Generated API 来进行对图片的处理。
4.1
编写一个类继承自AppGlideModule ,并用@GlideModule进行注解
/*
生成GlideApp对象
*/
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
}
4.2
@GlideExtension
public class MyGlideEctension
{
private MyGlideEctension(){}
/**
* 全局统一配置
* @param options
*/
@GlideOption
public static BaseRequestOptions<?> miniThumb(BaseRequestOptions<?> options) {
return options .placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.circleCrop();
}
}
4.3使用方法
/**
* 通过GlideAPP加载网络图片
*/
private void glideAppLoadUrlImage(String img)
{
GlideApp.with(this)
.load(img)
.miniThumb()
.into(imageView1);
}
5.Glide的常用方法
Glide.with(this)//此方法返回RequestManager对象
.load(url)//返回RequestBuilder对象
.apply(options)//设置Reauestion
.thumbnail(Glide.with(this)//加载缩略图,如果目标图片先于缩略图加载,则缩略图停止加载
.load(Thumbnailurl))
.error(Glide.with(this)//加载缩略图,如果目标图片先于缩略图加载,则缩略图停止加载
.load(errorImageUrl))//加载失败时,执行新的加载
.transition(GenericTransitionOptions.<Drawable>with(R.anim.fade))//占位图到主图的的动画效果,比较损耗性能
.listener(new RequestListener<Drawable>() {
//监听图片加载
返回fals表示没有被处理,会向下传递。
返回true表示已经被处理,不会向下传递
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
//图片加载失败
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
//图片加载成功
return false;
}
})
.into(imageView1);//设置目标容器
6.RequestOptions的常用配置
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.ic_launcher)//加载网络图片显示的占位图
.error(R.mipmap.ic_launcher)//请求出错的时候显示的图片
.circleCrop();//将图片变为圆形
.timeout(5*1000)//图片加载超时时间
.override(width,height);
关于Glide的使用大概就是这些,后续我会上传Demo供大家参考。
Demo在这里