Glide图片加载库详解

时间:2022-11-16 19:52:42

1、glide介绍

加载图片的框架有很多像:Picasso,Volley ImageLoader,Fresco这里我们主要介绍Glide,它也是Google推荐的一个加载网络框架。Glide与Picasso二者来说极其相似,可以看做Picasso的克隆版,但是Glide却更为好用。Glide的with方法可以接受Context,Activity 和 Fragment,Context会自动的从他们获取,也就更利于我们对Glide进行管理,根据具体需要让它具备Activity或者Fragment的生命周期。另外,Glide默认的Bitmap格式是RGB_565 ,比ARGB_8888格式的内存开销要小一半。

2、glide使用

2.1 导入库

lib方式导入就不说了,这里说下as下的builde.gradle导入。
Glide在jcenter上就不用再加额外的maven路径直接在app的builde.gradle添加,需要查看最新版本和源码地址的可以点这里

dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}

Glide依赖v4包所以同时导入,其实v4包基本已经成项目的标配了。后面的版本号根据自己调整

2.2 基础使用—加载图片

Glide.with(context)
.error(R.mipmap.error)//加载失败默认图片
.load(imgUrl) //加载的图片地址
.into(ImageView);//需要展示的ImageView

这里imgUrl可以是文件路径、uri、url、文件、资源id甚至可以是自定义类型

2.3 加载网络图片,加载中图片未能及时显示,这段时间显示的图片(也就是占位符),加载失败最终显示占位符

Glide.with(context)
.load(imageUrl)
.placeholder(R.mipmap.ic_launcher)
.into(imageView);

当加上error同理,在加载开始 – 加载完成这段时间显示placeholder,加载失败显示error

Glide.with(context).load(imageUrl).placeholder( R.drawable.ic_launcher).error( R.drawable.default_error ).into( imageView ) ;

这里需要注意的是如果使用placeholder,这个默认图尺寸跟控件大小一致,第一次加载的时候Glide认为图片应该是默认图那么大,而默认图尺寸比例跟实际加载出来的图尺寸比例不一样,结果有可能会变形了。把placeHolder这个设置去掉就好了

2.4 图片填充方式

2.4.1 使用centerCrop来填充,如果ImageView的Height是match_parent则图片就会被拉伸填充
Glide.with(context)
.load(imageUrl)
.centerCrop()
.into(imageView);
2.4.2 使用fitCenter填充,即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围,该图像将会完全显示,但可能不会填满整个ImageView。
Glide.with(context)
.load(imageUrl)
.fitCenter()
.into(imageView);

2.5 缩略图使用

2.5.1 先加载原图的1/10作为缩略图,再加载原图
Glide.with(context).load(imageUrl).thumbnail(0.1f).into(imageview) ;
2.5.2 用本地图片作为缩略图,然后再加载网络图片
DrawableRequestBuilder<Integer> builder = Glide
.with(context)
.load(R.mipmap.ic_launcher);

Glide.with(context).load(imgUrl).thumbnail(builder).into(imageView) ;

2.6 加载Gif

Glide.with(context).load(imgUrl).asGif().into(imageView) ;//显示动态图

Glide.with(context).load(imgUrl).asBitmap().into(imageView) ;//显示静态图

2.7 加载本地视频

imageView = (ImageView) findViewById( R.id.image_video );

String files = Environment.getExternalStorageDirectory().getAbsolutePath() + "/hh.mp4" ;

Glide.with(context).load(files).into( imageView ) ;

这里相当于加载一张缩略图,显示的是视频第一帧图像,不能播放,且只能加载本地视频

3、缓存策略

3.1、 缓存的使用

Glide 是一个二级缓存机制,内存和本地磁盘。所谓的本地磁盘既可以是内部的存储空间也可以是外部的SD卡。这里的二级缓存也就是先从内存获取当内存获取不到时从本地或者sqlite 查找,也找不到时从网络获取数据

3.1.1、 跳过内存缓存
Glide  
.with( context )
.load( url )
.skipMemoryCache( true )
.into( imageView );

这里我们使用skipMemoryCache( true )告诉Glide跳过内存缓存,顾名思义,它只是跳过内存缓存仍然会利用磁盘缓存避免重复网络请求。我们也可以看出,Glide默认是将资源进行内存缓存的所有设置skipMemoryCache( false )是没有意义的

3.1.2、 跳过磁盘缓存

当你有个图片资源具有着相同的url但是它的变化很快,可能你不需要进行磁盘缓存,这时可以使用diskCacheStrategy()方法来设置磁盘的行为。这里需要的参数是一个枚举,比如当是DiskCacheStrategy.NONE时将会禁用磁盘缓存,但是仍然会使用内存缓存

Glide  
.with( context )
.load( url)
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into( imageView );


//diskCacheStrategy()各个参数的含义如下
DiskCacheStrategy.NONE; // 什么都不缓存,就像刚讨论的那样
DiskCacheStrategy.SOURCE; //仅仅只缓存原来的全分辨率的图像。
DiskCacheStrategy.RESULT; //仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
DiskCacheStrategy.ALL; //缓存所有版本的图像(默认行为)

DiskCacheStrategy.SOURCE这个参数可以这样理解,比如你有一个图片可能会经常操作处理有着不同的版本型号,但是有意义的只是原始分辨率的图片,就可以使用这个参数来做缓存

当然,如果想要内存和磁盘缓存都禁用可以这样使用

Glide  
.with( context )
.load( url )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.skipMemoryCache( true )
.into( imageView );

3.2 缓存清理

3.2.1 清理内存缓存

需要在主线程执行

try {
if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行
Glide.get(context).clearMemory();
}
} catch (Exception e) {
e.printStackTrace();
}
3.2.2 清理磁盘缓存

需要在子线程来执行

try {
if (Looper.myLooper() == Looper.getMainLooper()) {
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();
}
}).start();
} else {
Glide.get(context).clearDiskCache();
}
} catch (Exception e) {
e.printStackTrace();
}

4、加载优先级

假如在一个ui上有着好几个图片,但是为了用户体验可以将一些较突出的图片优先加载出来就可以使用priority()方法来设置。需要注意的是,这里的优先级并不是严格遵守的,Glide会根据设定的准则尽可能的满足

 Glide
.with( context )
.load( url )
.priority( Priority.HIGH )
.into( imageViewHero );

priority()的参数如下,优先级一次递增

Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE