Glide是 Google 主导的图片加载开源库。它稳定、速度快、可自适应图片尺寸、支持众多格式、支持加载不同来源的图片、内存和磁盘缓存的优化等。
是一款主流的图片加载库即可,包含了你能想到的所有功能,并且支持扩展。Glide在Picasso基础上进行的二次开发,可以其优势显而易见。
(Volley、Picasso、Glide、Fresco)
(Github地址)
依赖
implementation 'com.github.bumptech.glide:glide:4.9.0'
混淆规则
##Glide
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
Glide的一个完整的请求至少需要三个参数
Glide.with(context)
.load(url)
.into(imageView);
- with(Context context) :上下文,这里还可以使用 Activity、Fragment的对象。将 Activity/Fragment 对象作为参数的好处是,图片的加载会和 Activity/Fragment 的生命周期保持一致,例如:onPaused 时暂停加载,onResume 时又会自动重新加载。所以在传参的时候建议使用 Activity/Fragment 对象,而不是 Context。
- load(String url) - 这里我们所使用的一个图片的 URL
- into(ImageView imageView) - 需要显示图片的目标 ImageView
Glide.with(context)
.load(url)
.placeholder(R.drawable.place_image)//图片加载出来前,显示的图片
.error(R.drawable.error_image)//图片加载失败后,显示的图片
.fallback(R.drawable.fallback_image)//指定传递加载资源为 null 的时候,显示的图片
.into(imageView);
- placeholder :指定加载前显示的图片资源。
- error:指定加载失败显示的图片资源。
- fallback:指定传递加载资源为 null 的时候,显示的图片资源。
- 注:这里需要注意一点,placeholder() 和 error() 的参数都是只支持 int 和 Drawable 类型的参数,这种设计应该是考虑到使用本地图片比网络图片更加合适做占位图。
在项目开发过程中,指定图片显示大小长长可能用到,毕竟从服务器获取的图片不一定都是符合设计图的标准的。我们在这里就可以使用 override(width,height) 方法,在图片显示到 ImageView 之前,重新改变图片大小。
Glide.with(context)
.load(url)
.override(width,height)//这里的单位是px
.into(imageView);
ImageView 本身提供了 ScaleType 属性,这个属性可以控制图片显示时的方式。
Glide 也提供了两个类似的方法 CenterCrop() 和 FitCenter()。
注:其实 Glide 的 CenterCrop() 和 FitCenter() 这两个方法分别对应 ImageView 的 ScaleType 属性中的 CENTER_CROP 和 FIT_CENTER 命名基本一致。
Glide 的缩略图功能在这里不得不说,和占位图略有不同,占位图必须使用资源文件才行,而缩略图是动态的占位图可以从网络中加载。缩略图会在世纪请求加载完成或者处理完之后才显示。在原始图片到达之后,缩略图不会取代原始图片,只会被抹除。
Glide 为缩略图提供了2种不同的加载方式,比较简单的方式是调用 thumbnail() 方法,参数是 float 类型,作为其倍数大小。例如,你传入 0.2f 作为参数,Glide 将会显示原始图片的20%的大小,如果原图是 1000x1000 的尺寸,那么缩略图将会是 200x200 的尺寸。为缩略图明显比原图小得多,所以我们需要确保 ImageView 的 ScaleType 设置的正确。
Glide.with( context )
.load( url )
.thumbnail( 0.2f )
.into( imageView );
注:应用于请求的设置也将应用于缩略图。
使用 thumbnail() 方法来设置是简单粗暴的,但是如果缩略图需要通过网络加载相同的全尺寸图片,就不会很快的显示了。所以 Glide 提供了另一种防止去加载缩略图
private void loadImageThumbnailRequest(){
// setup Glide request without the into() method
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( url );
// pass the request as a a parameter to the thumbnail request
Glide.with( context )
.load( url )
.thumbnail( thumbnailRequest )
.into( imageView );
}
与第一种方式不同的是,这里的第一个缩略图请求是完全独立于第二个原始请求的。该缩略图可以是不同的资源图片,同时也可以对缩略图做不同的转换,等等…
Glide 在显示图片的时候,为了让显示效果不那么突兀,会以一种更柔和的方式去显示,就会在加载的时候给一个动画效果,它可以使用 crossFade() 方法进行配置,如果不特殊处理,默认它是开启的,并且本身默认动画的时长是 300ms。
crossFade() 的效果是默认开启的,所以如果我们不需要这样的一个动画效果,可以使用 dontAnimate() 来禁用动画效果。
Glide.with(context)
.load(url)
.dontAnimate()
.placeholder(R.drawable.place_image)
.error(R.drawable.error_image)
.into(imageView);
PS:Glide 是可以自定义动画效果的
为了更快的加载图片,肯定希望可以直接拿到图片,而不是进行网络请求,所以我们需要缓存。Glide 通过使用默认的内存和磁盘缓存来避免不必要的网络请求。
Glide.with(context)
.load(url)
.skipMemoryCache(false)
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into(imageView);
内存缓存
默认开启的,.skipMemoryCache(false)
可以关闭。
磁盘缓存
默认开启,.diskCacheStrategy( DiskCacheStrategy strategy )
可以关闭。
DiskCacheStrategy 的枚举意义:
- DiskCacheStrategy.NONE 什么都不缓存
- DiskCacheStrategy.SOURCE 只缓存全尺寸图
- DiskCacheStrategy.RESULT 只缓存最终的加载图
- DiskCacheStrategy.ALL 缓存所有版本图(默认)
对于同一个页面,如果需要在多个地方都加载线上图片,必然会存在一个优先级的问题。例如:正常来说,背景图是比其他图片优先级更高的图片。
Glide 是可以在加载中,对当前加载的图片,调整加载的优先级的。需要使用.priority()
方法,它可以接受一个 Priority 的枚举类型,包含四种值:LOW(低)
、HIGH(高)
、NORMAL(普通)
、IMMEDIATE(立即)
。
Glide 支持 Gif
Glide.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.error )
.into( imageView );
- .asGif(): 校验它是否是一个 Gif ,如果不是,则认为是一次错误的加载。这个时候就可以使用 asGif() 来进行校验,如果当前加载的图片不是一个正确的 Gif 格式,则会去显示 error() 配置的图片。
- 有时候可能只为显示一张图片,可以强制显示 Gif 图片的第一帧,用 asBitmap() 方法替代asGif()即可。
Glide 还能显示视频(只能显示手机本地的视频)。但它和 Gif 显示的效果不一样的一点在于,它不会去播放视频文件,而只是将视频文件的第一帧做为一个图片去显示出来。
String filePath = "/storrage/emulated/0/Pictures/video.mp4";
Glide.with( context )
.load( Uri.fromFile( new File( filePath ) ) )
.into( imageView );
Glide 加载的图片的结果可以进行监听,使用 listener() 方法设置一个监听器,它接收一个 RequestListener 的接口
RequestListener requestListener = new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
return false;
}
};
Glide.with(context)
.load(url)
.listener(requestListener)
.into(imageView);
- 如果需要监听图片加载错误的原因,可以在 onLoadFailed() 中做处理。
- 需要注意的是,这两个方法的返回值,最好都是 false。因为如果返回 true ,将表示你已经处理了这次的事件,而 Glide 将不会再做额外的处理。例如,如果 onLoadFailed() 返回了 true 的话,在图片加载失败之后,error() 中设置的图片,并不会被显示,因为 Glide 认为开发者已经在外部对这个错误进行了处理。
对于使用 Glide 加载的图片,如果想要在其显示之前,对其进行一些变换操作,例如,改变颜色、虚化、圆角子类的,都需要用到 transfrom() 方法,它主要用于支持在图片显示之前,自定义的变换效果。
变换有两个方法
- transfrom():它可以添加一个通用的变换效果。
- bitmapTransfrom():限制了变换的类型,只能设置 Bitmap 的变换。
变换这种操作,其实定制性非常的强,展开讲就比较复杂了,大家只需要知道,Glide 是可以对加载的图片在显示之前进行一些预处理的操作的,在具体使用的时候再回头来看相关资料即可。
这里推荐一个开源的库,来支持大多数变换的效果。(Github 地址)