Glide.with()方法用于创建一个加载图片的实例.with()方法可以接受Context,Activity或者fragment类型的参数,
activity或者fragment被销毁的时候,图片加载也会停止,如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止;Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧,因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。
Glide支持加载各种各样的图片资源,包括网络图片,本地图片,应用资源,二进制流,Uri对象等等;
Glide可以指定图片大小,例如方法: .override(100, 100);这样Glide就只会将图片加载成100*100像素的尺寸,也不用管你的imageview的大小是多少
Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。内存缓存: 默认情况下,Glide自动就是开启内存缓存的,如果需要禁用内存缓存功能,只需要调用skipMemoryCache()方法并传入true,就表示禁用掉Glide的内存缓存功能;首先会将缓存图片从activeResources中移除,然后再将它put到LruResourceCache当中。这样也就实现了正在使用中的图片使用弱引用来进行缓存,不在使用中的图片使用LruCache来进行缓存的功能。
硬盘缓存: 这个diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切,它可以接收四种参数:
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
重写这个getCacheKey()方法可以解决缓存Key的问题
Glide提供了预加载的接口,也就是preload()方法,preload()方法的用法也非常简单,直接使用它来替换into()方法即可;
需要注意的是,我们如果使用了preload()方法,最好要将diskCacheStrategy的缓存策略指定成DiskCacheStrategy.SOURCE。
因为preload()方法默认是预加载的原始图片大小,而into()方法则默认会根据ImageView控件的大小来动态决定加载图片的大小。因此,如果不将diskCacheStrategy的缓存策略指定成DiskCacheStrategy.SOURCE的话,很容易会造成我们在预加载完成之后再使用into()方法加载图片,却仍然还是要从网络上去请求图片这种现象。
preload()方法有两个方法重载,带参数的preload()方法来明确指定图片的宽和高,不带参数的preload()方 法,它会在内部自动将图片的宽和高都指定成Target.SIZE_ORIGINAL,也就是图片的原始尺寸
downloadOnly(int width, int height)是用于在子线程中下载图片的,而downloadOnly(Y target)是用于在主线程中下载图片的。
listener() 在into()方法之前串接了一个listener()方法,然后实现了一个RequestListener的实例。
其中RequestListener需要实现两个方法,一个onResourceReady()方法,一个onException()方法。
当图片加载完成的时候就会回调onResourceReady()方法,
而当图片加载失败的时候就会回调onException()方法,onException()方法中会将失败的Exception参数传进来
dontTransform()方法表示让Glide在加载图片的过程中不进行图片变换,这样刚才调用的applyCenterCrop()、applyFitCenter()就统统无效了。或者直接调用override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)方法来强转将图片尺寸指定为原始大小就行了;
调用方法override()、centerCrop()、transform(new CircleCrop(this))组合能实现图片变换功能;
第三方库glide-transformations实现了很多通用的图片变换效果,例如裁剪变色,图片转换,模糊变换等等;例如:
模糊化处理:
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this))
.into(imageView);
黑白化效果:
Glide.with(this)
.load(url)
.bitmapTransform(new GrayscaleTransformation(this))
.into(imageView);
同时执行模糊化和黑白化的变换:
Glide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
.into(imageView);