Android Glide使用姿势与原理分析

作者: 午后一小憩

简介

Android Glide是一款强大的图片加载库,提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理,并介绍一些使用姿势,助你更好地运用这个优秀的库。

原理分析

Glide的原理复杂而高效。它首先基于给定的图片URL或资源ID进行加载,支持多种数据源,包括网络请求、本地文件和ContentProvider等。Glide通过缓存机制提高加载速度,同时还会将压缩后的图片存储在磁盘中,节省内存和流量。

Glide设计了一种称为RequestBuilder的模式,允许我们通过链式调用方法配置图片加载参数。这种设计让代码更简洁易读。

此外,Glide支持图片变换和加载动画,可以应用各种变换效果,如圆形图片、圆角图片和灰度图片等,同时也可以为图片加载过程添加动画效果,提升用户体验。

使用姿势

以下是优化后的一些Glide使用姿势,帮助你更充分地使用这个库:

添加依赖

首先,在项目中添加Glide的依赖:

implementation 'com.github.bumptech.glide:glide:4.12.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0'

加载图片

使用Glide加载图片非常简单,只需以下几行代码:

Glide.with(context).load(url).into(imageView)

这里的context是上下文对象,url是图片的URL,imageView是显示图片的ImageView。

设置占位符和错误图片

你可以利用placeholder()方法设置加载过程中显示的占位符图片,以及使用error()方法设置加载失败时显示的图片:

Glide.with(context).load(url).placeholder(R.drawable.placeholder).error(R.drawable.error).into(imageView)

设置缩略图

Glide支持设置缩略图,以提高加载速度。通过thumbnail()方法设置缩略图的URL或资源ID:

Glide.with(context).load(url).thumbnail(0.1f).into(imageView)

图片变换

你可以使用transform()方法为图片添加变换效果。例如,使用circleCrop()方法可将图片裁剪成圆形,roundedCorners()方法可将图片角变为圆角:

Glide.with(context).load(url).transform(CircleCrop()).into(imageView)

加载动画

通过animate()方法,你可以为图片加载过程添加动画效果。例如,使用crossFade()方法添加淡入淡出效果:

Glide.with(context).load(url).animate(R.anim.fade_in).into(imageView)

图片压缩

Glide通过根据目标ImageView的大小和ScaleType来计算图片的实际大小,并进行压缩。

在加载图片时,需要指定目标ImageView的宽高和ScaleType。Glide会根据这些信息决定图片的压缩方式。

若目标ImageView的宽高比例与图片的比例不一致,Glide会根据ScaleType计算缩放比例,然后将图片按比例压缩,以适应ImageView大小。

若目标ImageView的宽高比例与图片的比例一致,Glide会直接加载原始图片,不进行压缩。

通过这种方式,Glide根据目标ImageView来自动进行图片压缩,以提高加载速度和节省内存。

另外,Glide也支持自定义图片压缩策略。我们可以实现Transformation接口来定义自己的压缩算法。

自定义图片压缩策略

自定义图片压缩策略通过实现Transformation接口实现。该接口包含transform()方法,可以在其中定义自定义的压缩操作。

以下是一个示例,展示如何实现自定义的图片压缩策略:

class CustomTransformation : Transformation<Bitmap> {override fun transform(context: Context,resource: Resource<Bitmap>,outWidth: Int,outHeight: Int): Resource<Bitmap> {val originalBitmap = resource.get()// 自定义压缩算法val compressedBitmap = customCompress(originalBitmap)return BitmapResource(compressedBitmap, Glide.get(context).bitmapPool)}override fun getId(): String {return "customTransformation" // 返回唯一标识符,用于缓存}private fun customCompress(bitmap: Bitmap): Bitmap {// 自定义压缩算法实现// ...return compressedBitmap}
}

使用自定义图片压缩策略时,可以在Glide的链式调用中应用:

Glide.with(context).load(url).transform(CustomTransformation()).into(imageView)

通过实现Transformation接口,你可以根据需求制定不同的压缩算法,以满足特定的图片压缩需求。

图片缓存

Glide使用双缓存策略来管理图片缓存。它在内存中缓存未经压缩的原始图片,提升加载速度,同时还会将压缩后的图片存储在磁盘中,节省内存和流量。

Glide的缓存机制非常智能。它根据图片的URL或资源ID生成唯一的缓存键,以确保不同的图片不会混淆。此外,Glide支持自定义缓存的大小和有效期

,以适应不同需求。

Glide的缓存机制是其优秀性能的关键之一。通过内存缓存和磁盘缓存的组合,它能够高效地管理已加载的图像数据,从而提高后续加载的速度。

内存缓存

Glide使用内存缓存来存储最近使用的图像数据,以便快速访问。内存缓存基于LRU(Least Recently Used,最近最少使用)算法,保留最近加载的图像数据。当应用需要再次访问这些图像时,可以直接提供,从而避免频繁的网络请求和磁盘读取。

磁盘缓存

磁盘缓存分为活动资源缓存和非活动资源缓存。

  • 活动资源缓存(Active Resources Cache): 这是一个小型、可写的磁盘缓存,存储当前正在使用的图像数据。它有助于减少频繁加载的图片的重复磁盘读取。

  • 未活动资源缓存(Inactive Resources Cache): 这是一个更大、只读的磁盘缓存,用于长期存储已加载的图像数据。当活动资源缓存已满时,Glide会将不再活跃的图片从活动缓存中移至未活动资源缓存,以腾出空间供新图片使用。

缓存策略

Glide允许开发者根据需求设置不同的缓存策略。例如:

  • DiskCacheStrategy.ALL: 在内存和磁盘上都缓存。
  • DiskCacheStrategy.NONE: 不使用磁盘缓存。
  • DiskCacheStrategy.DATA: 只缓存原始数据。
  • DiskCacheStrategy.RESOURCE: 只缓存转换后的资源。
  • DiskCacheStrategy.AUTOMATIC: 根据图片数据源自动选择缓存策略。

清除缓存

若图片发生变化或需要释放存储空间,可手动清除Glide缓存。使用以下代码可清除磁盘缓存:

Glide.get(context).clearDiskCache()

清除内存缓存可使用:

Glide.get(context).clearMemory()

综上所述,Glide的缓存机制通过内存和磁盘缓存的组合,高效地提高了图像加载性能。这种机制使得相同图像能够更快地加载,节省了用户流量,并在离线或网络不稳定时也能正常显示图像。

结论

Android Glide是一款功能强大且灵活的图片加载库。通过深入了解其工作原理和应用方法,你可以更加自如地使用这个优秀的库,提升应用的图片加载体验。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Virtualenvwrapper 的安装教程

Virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包&#xff0c;用于更方便管理虚拟环境&#xff0c;它可以做&#xff1a; 将所有虚拟环境整合在一个目录下管理&#xff08;新增&#xff0c;删除&#xff0c;复制&#xff09;虚拟环境快速切换虚拟环境 安装方法 Li…

HTTP协议概述

HTTP 协议定义 HTTP协议&#xff0c;直译为超文本传输协议&#xff0c;是一种用于分布式、协作、超媒体的信息系统的应用协议。HTTP协议是万维网数据通信的基础。HTTP协议在客户端-服务器计算模型中充当请求-响应协议。客户端向服务器提交HTTP请求消息。服务器提供HTML文件和其…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

CData Drivers for SAS xpt Crack

CData Drivers for SAS xpt Crack 使用基于标准的驱动程序&#xff0c;加入数据库、报告工具和自定义程序中的实时SAS xpt(XPORT)数据文件。 与BI分析、报告、ETL工具和自定义解决方案集成。 适用于SAS xpt的CData驱动程序。神奇的功能&#xff1a; BI和分析 我们的驱动程序是将…

aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl 需要先用aarch64工具链编译zlib和openssl aarch64-linux环境搭建 下载工具链 gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnusysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-lin…

线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)

目录 3 向量空间的基&#xff1a;矩阵的基础/轴 3.1 从颜色RGB说起 3.2 附属知识 3.3 什么样的向量可以做基&#xff1f; 3.4 基的分类 3.1.1 不同空间的基---向量组的数量可能不同 3.1.2 自然基 3.1.3 正交基 3.1.4 标准正交基 3.1.5 基和向量/矩阵 3.1.6 基变换 …

ClickHouse进阶(五):副本与分片-1-副本与分片

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统&#xff0c; 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块&#xff0c;提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数&#xff0c;如&#xff1a; Tes…

【数据结构】带头双向循环链表及其实现

目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空 2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 1.带头双向循环…

stable diffusion实践操作-CLIP

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、CLIP是什么&#xff1f;1.1 定义&#xff1a;1.2 作用 二、使用步骤2.1 设置使用2.1 跳过层对比图&#xff1a; 三、总结 前言 学习本章之前&#xff0c;先看SD生图原理 stable diffusion实践操作-SD原理…

远程连接Ubuntu 22.04

远程连接Ubuntu 22.04 安装openssh-server sudo apt install openssh-server检查服务运行状态 systemctl status sshd重启服务状态 sudo systemctl restart ssh开启防火墙 sudo ufw enable开启ssh传输端口 sudo ufw allow ssh设置开机启动服务 sudo systemctl enable ssh配置服…

YOLOv5算法改进(12)— 替换主干网络之Swin Transformer

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Swin Transformer是一种基于Transformer的深度学习模型&#xff0c;它在视觉任务中表现出色。与之前的Vision Transformer&#xff08;ViT&#xff09;不同&#xff0c;Swin Transformer具有高效和精确的特性&#xff0c;并…

Flink流批一体计算(20):DataStream API和Table API互转

目录 举个例子 连接器 下载连接器&#xff08;connector&#xff09;和格式&#xff08;format&#xff09;jar 包 依赖管理 如何使用连接器 举个例子 StreamExecutionEnvironment集成了DataStream API&#xff0c;通过额外的函数扩展了TableEnvironment。 下面代码演示两…

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点&#xff08;能跳转、能高亮&#xff09;声明式导航-两个类名定制两个高亮类名 实现导航高亮&#xff0c;实现方式其实&#xff0c;css&#xff0c;JavaScript , Vue ,都可以实现。其实关于路由导航&…

AndroidStudio推荐下载和配置

1、推荐下载链接 Download Android Studio & App Tools - Android Developers 2、gradle配置案例 // Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {maven { url https://maven.aliyun.…

软考知识相关

1、计算机组成结构 计算机组成结构是指计算机系统的各个组成部分以及它们之间的相互关系和功能。通常&#xff0c;计算机组成结构可以分为以下主要部分&#xff1a; 中央处理单元&#xff08;CPU&#xff09;&#xff1a; CPU 是计算机的大脑&#xff0c;负责执行程序指令和处理…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…