Glide简介:
Android常用的图片加载框架有Glide和Fresco,Picasso比Glide更加简洁和轻量,Glide比Picasso功能更为丰富。今天我们来讲解Glide的基本用法。目前我们使用Glide的稳定版本是3.7.0,要想使用Glide,我们首先要将这个库引入到我们的项目当中。
Glide引用:(添加Glide库到build.gradle)
implementation 'com.github.bumptech.glide:glide:3.7.0'
Glide加载网络图片需要申请网络权限,给项目申请网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
添加了Glide库和网络权限,我们接下来测试Glide的基本用法:
首先我们尝试加载一张图片,这是一张图片的地址:
"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=1" +
"00&size=b4000_4000&sec=1552447551&di=fee8ca3e043e8b2c68d68648e5a93547&src=http" +
"://pic.90sjimg.com/back_pic/00/00/52/00/4901c7e259661a93e1423c8c62341da8.jpg"
首先在布局文件添加一个ImageView控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
然后在代码中用Glide加载网络图片:
//加载网络图片
private void loadNetWorkImg() {
String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=1" +
"00&size=b4000_4000&sec=1552447551&di=fee8ca3e043e8b2c68d68648e5a93547&src=http" +
"://pic.90sjimg.com/back_pic/00/00/52/00/4901c7e259661a93e1423c8c62341da8.jpg";
ImageView img = this.findViewById(R.id.img);
Glide.with(this).load(url).into(img);
}
通过测试网络图片已经被加载出来,看看Glide核心代码
Glide.with(this).load(url).into(img);
接下来我们了解Glide加载图片的过程,首先调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:
Glide这一行代码,做了非常多的事情,包含加载网络图片,加载手机本地图片,加载应用资源图片,例如:
加载应用资源图片:
//加载资源图片
private void loadResourceImg() {
ImageView img = this.findViewById(R.id.img);
Glide.with(this).load(R.mipmap.ic_launcher).into(img);
}
从assets中获取图片用Glide显示,这里我们从assets中获取的文件流,但是我们将文件流保存在应用的缓存目录,然后在Glide文件中显示:
//从assets中获取图片用Glide显示
private void loadLocalImg() {
ImageView img = this.findViewById(R.id.img);
copyAssetAndWrite("timg.jpg");
File dataFile=new File(getCacheDir(),"timg.jpg");
Glide.with(this).load(dataFile).into(img);
}
/**
* @Method copyAssetAndWrite
* @Description 我们根据文件
*/
private boolean copyAssetAndWrite(String fileName){
try {
File cacheDir = getApplicationContext().getCacheDir();
if (!cacheDir.exists()){
cacheDir.mkdirs();
}
File outFile =new File(cacheDir,fileName);
if (!outFile.exists()){
boolean res=outFile.createNewFile();
if (!res){
return false;
}
}else {
if (outFile.length()>10){//表示已经写入一次
return true;
}
}
InputStream is = this.getAssets().open(fileName);
FileOutputStream fos = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int byteCount;
while ((byteCount = is.read(buffer)) != -1) {
fos.write(buffer, 0, byteCount);
}
fos.flush();
is.close();
fos.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
Glide占位图功能
有时候图片加载的时候,为了优化用户体验,我们在网络图片未显示出来的时候,设置一张占位符图片,Glide API提供类占位符功能:
Glide.with(this)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.into(img);
以上代码,我们在中间插入placeholder()方法,然后将占位图的资源ID传入到这个方法中,打开应用测试,很可能看不到占位图的效果,因为Glide有非常强大的缓存机制,因为加载网络图片Glide会自动的将图片缓存,下次加载的时候直接从缓存中读取,因为加载速度快,所以占位图可能来不及显示。
异常占位符
当网络断开,服务器出现问题,导致图片显示不了,所以需要异常提示,Glide提供了异常占位图如下代码:
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.into(img);
Glide加载Gif图片
Glide加载gif图片,不需要写额外的代码,它内部会判断图片格式,还是调用之前的代码即可,如果只想让控件显示静态图片,我们可以在之前代码中间加入.asBitmap()方法。
Glide.with(this).load(url).asBitmap().into(img);
Glide的override()方法显示加载图片像素大小
以前我们在加载一张像素是1200*1200的图片,显示在像素大小为200*200的的ImageView中,如果我们不将图片进行压缩,直接读取到内存中,就会浪费内存,有时候多张这样的大图容易导致内存溢出,使用Glide,我们无需担心图片加载内存溢出,Glide会自动判断ImageView 的大小,然后之间这么大的图片加载到内存中,帮助APP节省内存开销。同时我们可以在Glide Api中指定加载图片的大小。
Glide.with(this).load(url).asBitmap()
.override(200,200).into(img);
Glide回调监听方法:
有时候加载大图,需要显示加载进度,或者显示大图加载错误提示,因此Glide为我们提供了RequestListener图片加载回调方法:
Glide.with(this).load(url).listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
}).override(400,400).into(img);
这里我们在into()方法之前串接了一个listener()方法,然后实现了一个RequestListener的实例。其中RequestListener需要实现两个方法,一个onResourceReady()方法,一个onException()方法。从方法名上就可以看出来了,当图片加载完成的时候就会回调onResourceReady()方法,而当图片加载失败的时候就会回调onException()方法,onException()方法中会将失败的Exception参数传进来,这样我们就可以定位具体失败的原因了。