我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 玩转Glide4---进阶使用篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 玩转Glide4---进阶使用篇

前言

系列文章专栏: 玩转Glide4
基础使用篇:Android 玩转Glide4—基础使用篇
进阶使用篇:Android 玩转Glide4—进阶使用篇
Transformation篇:Android 玩转Glide4—Transformation篇

概述

基础使用篇中我们简单介绍了Glide4的使用,以及相对于Glide3的变化。
本篇进阶篇,将会介绍预加载,生命周期,加载监听,下载图片等方面的内容。

预加载—preload()

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()方法了。

DrawableImageViewTarget

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

Android 玩转Glide4---进阶使用篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 玩转Glide4---进阶使用篇

前言 系列文章专栏: 玩转Glide4 基础使用篇:Android 玩转Glide4—基础使用篇 进阶使用篇:Android 玩转Glide4—进阶使用篇 Transformation篇:Android 玩转Glide4—Transform
2022-06-06

Android 玩转Glide4---Transformation篇

前言 系列文章专栏: 玩转Glide4 基础使用篇:Android 玩转Glide4—基础使用篇 进阶使用篇:Android 玩转Glide4—进阶使用篇 Transformation篇:Android 玩转Glide4—Transform
2022-06-06

玩转Android之Drawable的使用

Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用。1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候Drawable是一张图片,有的时候Dra
2022-06-06

Android中的Fragment类使用进阶

0、回顾 Fragment 代表 Activity 当中的一项操作或一部分用户界面。 一个 Activity 中的多个 Fragment 可以组合在一起,形成一个多部分拼接而成的用户界面组件,并可在多个 Activity 中复用。一个 Fr
2022-06-06

vuex新手进阶篇之actions的使用方法

actions用来处理mutations中的异步操作,触发mutations中的函数,下面这篇文章主要给大家介绍了关于vuex新手进阶篇之actions的使用方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

vuex学习进阶篇之getters的使用教程

getters用于获取state里的数据,它类似于计算属性,如果要获取的数据并没有发生变化的话,就会返回缓存的数据,下面这篇文章主要给大家介绍了关于vuex学习进阶篇之getters的使用教程,需要的朋友可以参考下
2022-11-13

vuex新手进阶篇之改变state mutations的使用

在vue的项目中不可避免的会使用到vuex用于数据的存储,下面这篇文章主要给大家介绍了关于vuex新手进阶篇之改变state mutations的使用,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

Android进阶CameraX与Camera2使用比对详解

这篇文章主要为大家介绍了Android进阶CameraX与Camera2使用比示例对详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-15

快速了解Android Room使用细则进阶

这篇文章主要为大家介绍了快速了解Android Room使用细则进阶,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-02

Vue 观察者的进阶技巧:玩转数据响应,打造高效应用

本文将深入探讨 Vue 观察者的进阶技巧,帮助开发人员掌握数据响应式编程的精髓,打造高效且响应迅速的 Vue 应用。我们将在使用场景、观察原理、优化技巧几个层面展开论述,并辅以贴切的代码示例,从多个角度透彻理解 Vue 观察者背后的机制和应用方法。
Vue 观察者的进阶技巧:玩转数据响应,打造高效应用
2024-02-06

Android中vim编辑器进阶的使用介绍

1. 移动指令 (1). h j k l, 方向键,记忆技巧:左右方向的是最左边和最右边的,j向下打了个勾,所以是向下键,剩下的k就是向上的键了。 (2). b, before,上一个单词(词首) w, wo
2022-06-06

MySQL进阶篇(03):合理的使用索引结构和查询

一、高性能索引1、查询性能问题在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的不断变大,解决查询性能的最常见手段是:针对查询的业务场景,设计合理的索引结构。2、索引使用原则索引的使用并不是越多越好,而
MySQL进阶篇(03):合理的使用索引结构和查询
2015-01-10

android UI进阶之android中隐藏的layout 抽屉的使用方法

最近在写一个应用,想把设置页面和应用页面放在一起,这样就能实现用户可以实时看到自己的设置对UI的影响,从而更方便的设置用户喜欢的界面。想了一段时间,发现用slidingDrawer这个控件可以实现这个效果。也就是一个抽屉。拉开抽屉,占据半个
2022-06-06

ASP 用户控件的进阶之道:深入解析控件生命周期,玩转动态交互

ASP 用户控件是 ASP.NET 中一种重要的可重用组件,可以帮助开发者快速构建复杂的 web 应用程序。本文深入解析了 ASP 用户控件的生命周期,并介绍了如何使用它来实现动态交互。
ASP 用户控件的进阶之道:深入解析控件生命周期,玩转动态交互
2024-02-26

Android开发中RecyclerView组件使用的一些进阶技讲解

RecyclerView的优势:它自带ViewHolder来实现View的复用机制,再也不用ListView那样在getView()里自己写了使用LayoutManager可以实现ListView,GridView以及流式布局的列表效果通过
2022-06-06

实例讲解Android中ViewPager组件的一些进阶使用技巧

我们经常看到使用了ViewPager的App,在每页上面都会有一个滑块来标志当前处于哪一页。在PagerView包里有android.support.v4.view.PagerTitleStrip和android.support.v4.vi
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录