Android 玩转Glide4---进阶使用篇
系列文章专栏: 玩转Glide4
基础使用篇:Android 玩转Glide4—基础使用篇
进阶使用篇:Android 玩转Glide4—进阶使用篇
Transformation篇:Android 玩转Glide4—Transformation篇
基础使用篇中我们简单介绍了Glide4的使用,以及相对于Glide3的变化。
本篇进阶篇,将会介绍预加载,生命周期,加载监听,下载图片等方面的内容。
Glide加载图片会自动判断图片是否在缓存中,以此来决定直接读取缓存还是直接下载。
但是如果我希望提前对图片进行一个预加载,比如有一张网络大图,进入页面最开始不需要展示,但是需要展示的时候我们想立刻展示出来,而不需要等待。
怎么办呢?----可以使用preload()方法。
public Target preload(int width, int height) //指定加载图片的宽和高
public Target preload() //加载图片的原始尺寸
preload()方法的用法非常简单,直接使用它来替换into()方法即可,如下代码:
Glide.with(this)
.load(ConstUrl.ImgGif)
.preload()
我们可以在页面打开的时候先preload()预加载,然后需要显示的into()接口,如下代码:
preload.setOnClickListener {
Glide.with(this)
.load(ConstUrl.ImgGif)
.into(ivPreload)
}
加载监听—listener()
如果一张网络图片未按照预期中显示出来,我们就需要知道它的加载状态。listener()用来监听Glide加载图片的状态失败还是完成。
Glide.with(this).load(ConstUrl.ImgOne).listener(object : RequestListener {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean {
Log.e(TAG, "onLoadFailed", e)
return false
}
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
Log.i(TAG, "onResourceReady")
resource.to
return false
}
}).into(ivListener)
不过还有一点需要处理,onResourceReady()方法和onLoadFailed()方法都有一个布尔值的返回值,返回false就表示这个事件没有被处理,还会继续向下传递,返回true就表示这个事件已经被处理掉了,从而不会再继续向下传递。
图片下载—submit()如果没有图片框架的帮助下我们去显示一张网络图片,通常的做法都是异步线程下载字节流保存到本地为File,然后再显示这个File。
对于Glide来说,将图片保存在本地有很多中方法,比如上面的listener方法的onResourceReady回调中,我们可以拿到Drawable.toBitmap()转为Bitmap对象,然后再转为字节流存在File中。
然而Glide给我们提供了一个更加便捷的方法submit()。
相对与preload(),submit()只会下载图片,不会加载,也不会缓存图片,需要我们拿到下载完成图片文件自己去操作。
public FutureTarget submit() //下载原始尺寸的图片
public FutureTarget submit(int width, int height) //指定下载图片的尺寸
调用了submit()方法后会返回一个FutureTarget对象,然后Glide会在后台开始下载图片。接下来需要我们调用FutureTarget的get()方法去获取下载图片文件,如果此时图片还没有下载完,那么get()方法就会阻塞住,一直等到图片下载完成才会有值返回。
因此submit()必须在异步线程中执行,代码如下:
download.setOnClickListener {
Thread(Runnable {
val taget = Glide.with(this).asFile().load(ConstUrl.ImgOne).submit()
val imgFile = taget.get()
runOnUiThread {
Glide.with(this).load(imgFile).into(ivDownload)
Toast.makeText(this, imgFile.path, Toast.LENGTH_LONG).show()
}
}).start()
}
生命周期—Target
Gilde的into()方法,通常我们都是传ImageView的,但是查看源码就知道它还能传Target类型的参数。
你会发现Target中有两个重写函数onResourceReady,onLoadFailed跟listener很相似,实际上他们的作用也几乎一致,那么他们的区别是什么呢?
你可以理解Target中的这两个函数为listener中分发函数,主要便于我们自定义Target时使用。
分发体现在:如果我们在RequestListener的onResourceReady()方法中返回了true,那么就不会再回调Target的onResourceReady()方法了。
Gilde4中封装好了一些ViewTarget,我们可以很方便的调用,我们以DrawableImageViewTarget为例子。
比如我们需要在加载图片的时候先显示一个进度条,加载完成后进度条消失,代码如下
val simpleTarget = object : DrawableImageViewTarget(ivInto) {
override fun onResourceReady(resource: Drawable, transition: Transition?) {
super.onResourceReady(resource, transition)
progressBar.hide()
}
override fun onLoadStarted(placeholder: Drawable?) {
super.onLoadStarted(placeholder)
progressBar.show()
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
}
override fun onLoadCleared(placeholder: Drawable?) {
super.onLoadCleared(placeholder)
}
override fun onStart() {
super.onStart()
}
override fun onStop() {
super.onStop()
}
override fun onDestroy() {
super.onDestroy()
}
}
val optionInto = RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
Glide.with(this).load(ConstUrl.ImgGif).apply(optionInto).into(simpleTarget)
自定义Target—CustomViewTarget
我们可以让Glide加载出来的图片不显示到ImageView上吗?答案是肯定的,这就需要用到自定义Target功能。
我们简单实现如下布局控件,我们要在左边显示网路图片,右边显示ic_launcher。代码如下:
class MyTarget constructor(view: View) : CustomViewTarget(view) {
override fun onLoadFailed(errorDrawable: Drawable?) {
}
override fun onResourceCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Drawable, transition: Transition?) {
view.findViewById(R.id.iv1).setImageDrawable(resource)
}
}
Glide.with(this).load(ConstUrl.ImgOne).apply(optionInto).into(MyTarget(targetLayout))
代码
GitHub: https://github.com/DeMonDemo/Glide4Img
参考郭霖的专栏—Glide最全解析
作者:DeMonnnnnn
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341