关于安卓SVGA浅尝(一)svgaplayer库的使用

2023-09-17 15:45:51

关于安卓SVGA浅尝(一)使用

请添加图片描述

相关链接

SVGA官网
SVGA-github说明文档

背景

项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中用到了svga的动画,因此,就有了这一系列的文章。

使用

(1)引入

首先,引入的方式,大致有两种:
一种是直接使用远程依赖,示例代码如下:

工程 build.gradle 中,添加仓库

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
然后,在应用 build.gradle 中添加依赖。
compile 'com.github.yyued:SVGAPlayer-Android:latest'

第二种,就是把项目中的library拉下来,进行项目中的module依赖。

由于目前该svga库官方已经声明不再进行维护了,建议直接拉下来,作为model引入到项目中。
(2)混淆

使用以下的代码进行混淆:

-keep class com.squareup.wire.** { *; }
-keep class com.opensource.svgaplayer.proto.** { *; }
(3)初始化

使用前,需要对SVGAParser进行初始化,才能进行使用。
注意,如果是对一些资源涉及到预加载等情况,的确是需要对SVGAParser进行初始化。
但是,如果仅仅是使用SVGAImageView进行数据显示(XML中指定资源路径),则无需初始化,因为通过阅读源代码发现,在使用SVGAImageView的过程中,其方法parserSource()会进行SVGAParser的初始化。

(一)xml布局中,直接声明svga控件需要播放的动画:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.opensource.svgaplayer.SVGAImageView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        app:source="posche.svga"
        app:autoPlay="true"
        android:background="#000" />

</RelativeLayout>

启动页面,即可进行预览,效果图如下:
请添加图片描述
更多的xml使用标签,请参阅官方文档。
这里就是使用xml进行svga实现的一个方法。但是这种方法一般局限性都比较大,所以这里介绍另外一种方法,“使用代码进行实现“。

(二)使用代码实现:
初始化:

SVGAImageView imageView = new SVGAImageView(this);
parser = SVGAParser.shareParser()
SVGAParser.shareParser().init(this);

加载资源:

创建一个 SVGAParser 实例,加载 assets 中的动画。

parser = new SVGAParser(this);
// 第三个为可缺省参数,默认为 null,如果设置该方法,则内部不在处理音频的解析以及播放,会通过 PlayCallback 把音频 File 实例回传给开发者,有开发者自行控制音频的播放与停止。
parser.decodeFromAssets("posche.svga", object : SVGAParser.ParseCompletion {
    // ...
}, object : SVGAParser.PlayCallback {
    // The default is null, can not be set
})

创建一个 SVGAParser 实例,加载远端服务器中的动画。

parser = new SVGAParser(this);
// 第三个为可缺省参数,默认为 null,如果设置该方法,则内部不在处理音频的解析以及播放,会通过 PlayCallback 把音频 File 实例回传给开发者,有开发者自行控制音频的播放与停止。
parser.decodeFromURL(new URL("https://github.com/yyued/SVGA-Samples/blob/master/posche.svga?raw=true"), new SVGAParser.ParseCompletion() {
    // ...
}, object : SVGAParser.PlayCallback {
    // The default is null, can not be set
})

创建一个 SVGADrawable 实例,并赋值给 SVGAImageView,然后播放动画。

parser = new SVGAParser(this);
parser.decodeFromURL(..., new SVGAParser.ParseCompletion() {
    @Override
    public void onComplete(@NotNull SVGAVideoEntity videoItem) {
        SVGADrawable drawable = new SVGADrawable(videoItem);
        imageView.setImageDrawable(drawable);
        imageView.startAnimation();
    }
    @Override
    public void onError() {

    }
});

上述就是加载,显示svga的方式。可以看出,加载的资源可以是本地,也可以是服务端。而对于服务端的资源,缓存逻辑则需要自行定义,最后,通过一个加载回调,复制数据到控件中,则可以进行动画显示。

缓存逻辑示例代码如下:

val cacheDir = File(context.applicationContext.cacheDir, "http")
HttpResponseCache.install(cacheDir, 1024 * 1024 * 128)

而最后的SVGASoundManager,就是一个svga的音频播放管理类,相关的api这里就不在意义叙述,可以参看官方文档进行查看。

关于svga的初步使用,就介绍到这里,后续将会深入介绍svga实现方式,加载原理等逻辑

that’s all---------------------------------------------------------------------

更多推荐

浅谈电力电容器技术的发展及选型

安科瑞华楠摘要:介绍了我国电力电容器产品制造技术的发展现状。在与国外电力电容器产品先进水平对比的基础上,讨论了我国电力电容器产品的差距和某些对策,并对我国电力电容器技术发展趋势提出了一些看法。关键词:电力电容器;制造技术;技术发展0引言电力电容器是一种重要的基础工业产品,他是电力系统并联无功补偿、串联补偿、谐波滤波装置

基变换与矩阵对角化

矩阵乘法的本质是映射坐标的意思是把映射到以和为基的向量空间中表示将展示成我们正常基向量空间中显示,而是将用其本身的坐标系展示。这也是基变换的本质,如果想对一组在向量空间中的向量进行旋转操作,旋转逆时针90度,则需要先将其转换为我们向量空间中显示,即,然后再执行旋转操作,最后再将它转变为自己的坐标系展示,。就是基变换。特

驾驭Java线程池:一步一步带你从新手到高手!

驾驭Java线程池:一步一步带你从新手到高手!java框架中例如Tomcat、Dubbo等都离不开线程池,这些框架用到线程的地方,都会用线程池来负责。我们在使用这些框架的时候,会设置线程池参数,用于提高性能。那么开多少线程合适?今天我们将围绕这个问题来学习一下线程池。为什么使用线程池平常我们使用java线程的时候,都是

浅谈Rust内存管理

Rust因在内存管理上的独到之处,近年来受到了不少开发者的青睐。Rust内存管理的核心功能就是所有权。不同的语言采取了不同的内存管理方式,主要分为开发者手动管理或者编译器辅助管理,以及垃圾回收机制等。Rust的所有权机制,有别于这两者。堆栈内存我们知道程序会在堆或者栈上创建数据。栈上创建数据很容易,只要知道数据的大小,

WMS仓储管理系统的主要类型及其特性和适用场景

WMS仓储管理系统是物流管理系统中至关重要的一部分。它被广泛用于各个行业,包括制造业、零售业、物流业和运输业等。在选择适合的仓库管理系统时,企业需要根据自身的业务需求和运营模式进行考虑。本文将详细介绍四种常见的仓储管理系统类型,包括独立仓储管理系统、供应链管理系统中的仓储管理模块、ERP系统中的仓储管理模块和基于云的仓

R语言进行孟德尔随机化+meta分析(1)---meta分析基础

目前不少文章用到了孟德尔随机化+meta分析,今天咱们也来介绍一下,孟德尔随机化+meta其实主要就是meta分析的过程,提取了孟德尔随机化文章的结果,实质上就是个meta分析,不过多个孟德尔随机化随机化的结果合并更加加强了结果的可靠性。有部分人可能对meta分析不是很了解,咱们今天先来介绍一下meta分析基础,为下一

MySQL高频面试题

文章目录1.什么是MySQL?2.关系型数据库和非关系型数据库3.数据库三大范式是什么?4.一条SQL查询语句是如何执行的5.引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性6.索引16连问什么是索引?索引的优缺点?索引的作用?索引设计的原则?什么

Postman —— HTTP请求基础组成部分

一般来说,所有的HTTPRequest都有最基础的4个部分组成:URL、Method、Headers和body。(1)Method要选择Request的Method是很简单的,Postman支持所有的请求方式。(2)URL要组装一条Request(请求),URL永远是你首先要填的内容。在Postman里面,你曾输入过的

【Unity每日一记】资源加载相关和检测相关

👨‍💻个人主页:@元宇宙-秩沅👨‍💻hallo欢迎点赞👍收藏⭐留言📝加关注✅!👨‍💻本文由秩沅原创👨‍💻收录于专栏:unity每日一记⭐🅰️推荐文章⭐⭐【软件设计师高频考点暴击】⭐【Unityc#专题篇】之c#系统化大礼包】⭐【unity数据持久化】数据管理类_PlayerPrfs⭐【unity本

【python百炼成魔】Python循环语句:掌握while循环的实战应用

前言文章目录前言循环结构1.什么是循环结构2.python的while循环3.循环语句的图示while的使用案例1.使用while循环打印从1到5的数字2.计算1-100的偶数和3.模拟用户登录给三次机会4.猜数字游戏总结循环结构1.什么是循环结构循环结构是编程中的一种控制结构,用于重复执行一段代码块,直到满足特定的条

Vite 完整版详解

1.打包构建:Vite使用Rollup作为默认的构建工具。通过运行npmrunbuild命令,Vite会将应用程序的源代码打包成一个或多个优化的静态文件,以便在生产环境中进行部署。Vite的构建过程会根据需要进行代码拆分、压缩和优化,以提供最佳的性能和文件大小。#package.json{"scripts":{"bui

热文推荐