关于安卓SVGA浅尝(二)加载数据
关于安卓SVGA浅尝(二)加载数据

相关链接
SVGA官网
SVGA-github说明文档
背景
项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中用到了svga的动画,因此,就有了这一系列的文章。
实现
对于svga的加载方法,有以下几种:
(1)decodeFromURL()
(2)decodeFromAssets()
对于(1)方法,就是从网络url加载一个url并在本地显示的意思。方法(2),就是读取本地assets文件进行显示。
方法(1)的实现逻辑,具体如下:
1、对传入的数据进行一个数据转换,得出一个数据缓存的key值。
2、若key值对应的缓存存在,则直接加载数据(区分是默认缓存路径还是其他缓存路径)
3、否则进行网络请求,通过HttpURLConnection请求写入得出一个ByteArrayInputStream对象后回调外部,执行
SVGAVideoEntity对象的封装后,回调出外部并交由外部执行。(这里得出ByteArrayInputStream后的逻辑,和
decodeFromAssets()方法读取文件后的逻辑,是一致的,都是调用decodeFromInputStream()这个防范进行处理)
而最后通过“流”到构建出“SVAVideoEntity”过程中,构造方法有一段这样的代码:
constructor(entity: MovieEntity, cacheDir: File, frameWidth: Int, frameHeight: Int) {this.mFrameWidth = frameWidththis.mFrameHeight = frameHeightthis.mCacheDir = cacheDirthis.movieItem = entityentity.params?.let(this::setupByMovie)try {parserImages(entity)} catch (e: Exception) {e.printStackTrace()} catch (e: OutOfMemoryError) {e.printStackTrace()}resetSprites(entity)}
核心代码,就是parserImages(entity)这个方法,里面的实现源码如下:
private fun parserImages(obj: MovieEntity) {obj.images?.entries?.forEach { entry ->val byteArray = entry.value.toByteArray()if (byteArray.count() < 4) {return@forEach}val fileTag = byteArray.slice(IntRange(0, 3))if (fileTag[0].toInt() == 73 && fileTag[1].toInt() == 68 && fileTag[2].toInt() == 51) {return@forEach}val filePath = generateBitmapFilePath(entry.value.utf8(), entry.key)createBitmap(byteArray, filePath)?.let { bitmap ->imageMap[entry.key] = bitmap}}}
可以看出,这里对传入对象的images集合类进行了遍历,最后通过createBitmap方法,创建了一个对象,
并且赋值给了SVAVideoEntity这个对象中的imageMap集合。
而对于parserImages方法中的入参“MovieEntity”,大部分都是通过方法“MovieEntity.ADAPTER.decode”进行对象构建。
这个方法是依赖于com.opensource.svgaplayer.proto这个包目录下的的方法在MovieEntity如下:
@Overridepublic MovieEntity decode(ProtoReader reader) throws IOException {Builder builder = new Builder();long token = reader.beginMessage();for (int tag; (tag = reader.nextTag()) != -1;) {switch (tag) {case 1: builder.version(ProtoAdapter.STRING.decode(reader)); break;case 2: builder.params(MovieParams.ADAPTER.decode(reader)); break;case 3: builder.images.putAll(images.decode(reader)); break;case 4: builder.sprites.add(SpriteEntity.ADAPTER.decode(reader)); break;case 5: builder.audios.add(AudioEntity.ADAPTER.decode(reader)); break;default: {FieldEncoding fieldEncoding = reader.peekFieldEncoding();Object value = fieldEncoding.rawProtoAdapter().decode(reader);builder.addUnknownField(tag, fieldEncoding, value);}}}reader.endMessage(token);return builder.build();}
最后调用的方法builder.build()核心代码如下:
@Overridepublic MovieEntity build() {return new MovieEntity(version, params, images, sprites, audios, super.buildUnknownFields());}
可以看出,整个过程,就是通过类型的判断,然后构建出对应类型的一个自定义数据对象,也就是我们的MovieEntity对象。
整个大体的加载实现思路,可以简单地描述如下:
(1)传入资源url/路径,调用对应加载方法进行加载
(2)区分网络加载还是本地加载,网络加载会先走缓存逻辑,否则直接网络io进行加载
(3)通过加载方法,最后都会生成一个IO流,传入一个处理流的通用方法里面,进行MovieEntity对象构建,回调
(4)最后通过SVGADrawable的构造,设置给SVGAImageView对象,最后调用SVGAImageView对象的startAnimation()方法,即可显示动画。
上述就是svga文件,加载到显示的整体流程,至于其中的细节,如缓存key的生成,MovieEntity对象构造,可以拉官方module
的代码进行研究。
关于svga更多的源码阅读,将会在后面的文章一一描述,本次文章先到这里。
that’s all--------------------------------------------------------------------------------
相关文章:
关于安卓SVGA浅尝(二)加载数据
关于安卓SVGA浅尝(二)加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项…...
使用matlab产生二维动态曲线视频文件具体举例
使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候,需要用到直观的动态显示,本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …...
Selenium自动化测试框架常见异常分析及解决方法
01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …...
[TI] [Textual Inversion] An image is worth an word
自己的理解: 根据几个图像,找出来一个关键字可以代表它们,然后我们可以再用这个关键字去生成新的东西。 提出关键字 1 Introduction word->token->embedding Textual Inversion过程 需要: ① a fixed, pre-trained text…...
remote: The project you were looking for could not be found
git拉取公司项目时报错: remote: The project you were looking for could not be found 发生这个问题的原因,在于git账号可能并未真正登录。 我们可以通过打开电脑的凭据管理器,查看git当前的登录是否正常。 参考链接:参考...
https跳过SSL认证时是不是就是不加密的,相当于http?
https跳过SSL认证时是不是就是不加密的,相当于http?,其实不是,HTTPS跳过SSL认证并不相当于HTTP,也不意味着没有加密。请注意以下几点: HTTPS(Hypertext Transfer Protocol Secure)本质上是在HTTP的基础上…...
linux下链接
linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接: 格式: ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…...
OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)
什么是主成分分析? 这是理解这篇文章的先决条件。 图 1:使用蓝线和绿线显示 2D 数据的主要组成部分(红点)。 快速回顾一下,我们了解到第一个主成分是数据中最大方差的方向。第二主成分是空间中与第一主成分垂直(正交)的最大方差方向,依此类推。第一和第二主成分红点(2…...
多层感知机——MLP
源代码在此处:https://github.com/wepe/MachineLearning/tree/master/DeepLearning Tutorials/mlp 一、多层感知机(MLP)原理简介 多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN&…...
HttpClientr入门
HttpClientr入门 介绍 HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的,最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议的版本和建议。 依赖导入 <dependency><groupId>org.apache.…...
网关-开放API接口签名验证方案
接口安全问题 请求身份是否合法?请求参数是否被篡改?请求是否唯一? AppId&AppSecret 请求身份 为开发者分配AppId(开发者标识,确保唯一)和AppSecret(用于接口加密,确保不易被…...
Linux知识点 -- 网络基础 -- 传输层
Linux知识点 – 网络基础 – 传输层 文章目录 Linux知识点 -- 网络基础 -- 传输层一、传输层协议1.端口号2.网络相关bash命令 二、UDP协议1.UDP报文的解包与交付2.理解UDP报文3.UDP协议的特点4.UDP应用层IO类接口5.UDP的缓冲区6.UDP使用注意事项7.基于UDP的应用层协议 三、TCP协…...
计算机视觉与深度学习-经典网络解析-AlexNet-[北邮鲁鹏]
这里写目录标题 AlexNet参考文章AlexNet模型结构AlexNet共8层:AlexNet运作流程 简单代码实现重要说明重要技巧主要贡献 AlexNet AlexNet 是一种卷积神经网络(Convolutional Neural Network,CNN)的架构。它是由Alex Krizhevsky、Il…...
Django学习笔记-实现联机对战(下)
笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 CONTENTS 1. 编写移动同步函数move_to2. 编写攻击同步函数shoot_fireball 1. 编写移动同步函数move_to 与上一章中的 create_player 同步函数相似,移动函数的同…...
一文了解什么SEO
搜索引擎优化 (SEO) 是一门让页面在 Google 等搜索引擎中排名更高的艺术和科学。 一、搜索引擎优化的好处 搜索引擎优化是在线营销的关键部分,因为搜索是用户浏览网络的主要方式之一。 搜索结果以有序列表的形式呈现,网站在该列表中的排名越高&#x…...
SpringBoot+Jpa+Thymeleaf实现增删改查
SpringBootJpaThymeleaf实现增删改查 这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。 1、pom依赖 pom 包里面添加Jpa 和 Thymeleaf 的相关包引用 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…...
最快的包管理器--pnpm创建vue项目完整步骤
1.用npm全局安装pnpm npm install -g pnpm 2.在要创建vue项目的包下进入cmd,输入: pnpm create vue 3.输入项目名字,选择Router,Pinia,ESLint,Prettier之后点确定 4.cd到创建好的项目 ,安装依赖 cd .\刚创建好的项目名称\ p…...
算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树
文章目录 前言1. 有序数组转二叉搜索树2. 寻找连个正序数组的中位数总结 前言 提示:有时候,我感觉自己一辈子活在两个闹钟之间,早上的第一次闹钟,以及5分钟之后的第二次闹钟。 --奥利弗萨克斯《意识的河流》 每个专题都有简单题&a…...
Mock.js之Element-ui搭建首页导航与左侧菜单
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想,为了不断更新自己 ! 1、Mock.js的使用 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器,用来帮助前…...
robotframework在Jenkins执行踩坑
1. Groovy Template file [robot_results.groovy] was not found in $JENKINS_HOME/email_template 1.需要在managed files 添加robot_results.groovy。这个名字需要和配置在构建项目里default content一致(Extended E-mail Notification默认设置里Default Content…...
MoocDownloader:三步轻松下载中国大学MOOC课程,实现离线学习自由
MoocDownloader:三步轻松下载中国大学MOOC课程,实现离线学习自由 【免费下载链接】MoocDownloader An MOOC downloader implemented by .NET. 一枚由 .NET 实现的 MOOC 下载器. 项目地址: https://gitcode.com/gh_mirrors/mo/MoocDownloader 你是…...
3个神奇步骤:用QRazyBox轻松修复任何损坏的二维码
3个神奇步骤:用QRazyBox轻松修复任何损坏的二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过这种情况:一张重要的二维码因为打印模糊、表面划伤或…...
Bilibili-Evolved插件化架构深度剖析:构建可扩展的哔哩哔哩增强体验
Bilibili-Evolved插件化架构深度剖析:构建可扩展的哔哩哔哩增强体验 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved作为一款强大的哔哩哔哩增强脚本,…...
深入STM32中断系统:从EXTI触发到NVIC裁决的完整流程剖析(附流程图详解)
深入STM32中断系统:从EXTI触发到NVIC裁决的完整流程剖析 在嵌入式开发中,中断系统是实时响应的核心机制。对于STM32开发者而言,深入理解从外部信号触发到CPU执行中断服务程序(ISR)的完整链路,是优化系统实时性、排查异常问题的关…...
AzurLaneLive2DExtract:碧蓝航线Live2D资源提取的完整指南
AzurLaneLive2DExtract:碧蓝航线Live2D资源提取的完整指南 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 想要从碧蓝航线游戏中提取精美的Live2D…...
别再一段段拼了!用UE4蓝图+Spline Component一键生成连续管道/道路模型
UE4蓝图Spline Component自动化生成复杂路径模型实战指南 在游戏开发中,创建蜿蜒的管道、复杂的赛道或是连绵的城墙往往需要耗费大量时间。传统的手动拼接SplineMesh组件的方式不仅效率低下,而且难以保证模型的连续性和一致性。本文将深入探讨如何利用UE…...
ARM MHU寄存器架构与核间通信优化指南
1. ARM MHU寄存器架构概述在ARM多核处理器架构中,MHU(Message Handling Unit)是实现核间通信的关键硬件模块。作为专门优化的消息传递单元,MHU通过精心设计的寄存器组实现了高效的数据传输和中断管理机制。不同于传统的共享内存通…...
Allegro与OrCAD联动实操:如何安全高效地完成PCB位号‘反向同步’而不飞器件?
Allegro与OrCAD协同设计中的位号反标:规避风险的全流程实战指南 在复杂电子系统设计领域,Cadence Allegro与OrCAD的协同工作流程已成为行业标准配置。当PCB布局工程师经过多轮迭代优化器件位置后,如何将最终的位号变更安全地反向同步到原理图…...
3步完成网易云音乐ncm文件转换:免费高效的Windows图形界面工具完整指南
3步完成网易云音乐ncm文件转换:免费高效的Windows图形界面工具完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载…...
第1章:AI Agent认知与全景图
本章你将收获:AI Agent的核心概念与演变历程;主流框架(LangChain、AutoGPT、CrewAI)的深度对比与选型指南;5个真实Agent应用案例的拆解;一套评估项目是否需要引入Agent的决策方法论;以及可运行的Agent代码示例(含免费API)。 📌 本章导读 2024年以来,“AI Agent”成…...
