h5进行svga动画礼物特效播放的代码实现队列按顺序播放

news2025/1/12 3:52:26

需求描述:

在直播场景中,有很多的礼物特效动画,如采用Svga动画的播放方案,则会遇到以下问题;

1.svga文件的预加载,

2.动画的顺序播放队列。即前一个动画播放完了,才会播放下一个动画。

1.svga文件的预加载,又分两种情况,

a)全部文件预先加载,到时候播放直接调用就行,但这样刚开始的时候会占用大量带宽。

b)按需加载,即在播放某个动画的时候,第一次进行加载,以后就不需要进行加载了,但第一次会有一些卡顿,可以增加一个loading的动画来改善用户体验。

2.动画的顺序播放

每当有用户赠送礼物的时候,我们会将这个动画放入动画播放队列尾部,等待其前一个动画播放完成后,再播放这个动画。防止动画交叉播放。等待上一个动画播放完成的一个重点事件是onPercentage和onFinished函数。我们用的是onPercentage函数,即播放进度。

因为我们是按顺序播放的,即是从播放队列中的第一个开始播放,所以,动画播放队列第一个播放完成后,即可删除第一个元素。然后第二个就变成了第一个,这样播放阶列越来越少。节省资源。

另外,文件缓存单独放一个队列,即svga文件缓存队列。

完整的代码如下

/**
 * Created with 快兔科技 老李.
 * User: 手机模板网
 * Date: 2023/12/3
 * Time: 15:20
 * sjmoban.com
 *  QQ: 79089679
 */
//播放队列有几个方法
var dl = {
    stData: {//状态参数
        isLoading: 0,
        playing: 0,
        dhIndex: -1
    },
    filelist: [],//文件列表,因为有一些文件是重复的,所以这个存放文件即可,
    //{filepath:"",loaded:0}//文件路径,是否加载了。
    clearData: function () {
        var that = this;
        that.dhlist = [];
        that.stData.isLoading = 0;
        that.stData.playing = 0;
    },
    fn_fileIndex: function (filepath) {
        var that = this;
        for (var i in that.filelist) {
            if (that.filelist[i].filepath == filepath) {
                return i;
            }
        }
        return -1;
    },
    addFile: function (svgaPath) {
        var that = this;
        //先看看文件在不在。
        var file_init = 0;
        var file_loaded = 0;
        var file_index = -1;
        for (var i in that.filelist) {
            if (that.filelist[i].filepath == svgaPath) {//即在里面,将其加载状态也带上
                file_init = 1;
                file_index = i;//得到当前的
                file_loaded = parseInt(that.filelist[i].loaded);
            }
        }
        //如果文件不在里面
        if (!file_init) {//即文件不在里面,加到里面,
            that.filelist.push({filepath: svgaPath, loaded: 0, videoItem: {}});//不在里面
            file_index = that.filelist.length - 1;//得到文件的索引值
        }
        //预加载加进来的这个文件
        if (!that.filelist[file_init].loaded) {//即没加载,则需要加载这个文件
            that.parser.load(svgaPath, function (videoItem) {//先检查这个文件是否loaded过,这样的话,就可以直接loaded了
                var fi = that.fn_fileIndex(svgaPath);
                if (fi >= 0) {
                    that.filelist[fi].videoItem = videoItem;
                    that.filelist[fi].loaded = 1;
                }
            });
        }
        var index = -1;
        var ta = {
            fileIndex: file_index,
            filepath: svgaPath,
            played: 0,
            loaded: 0,
            index: -1
        };
        //预加载这个文件,然后将loaded设置为1,才能正常播放,否则会播放不流畅
        that.dhlist.push(ta);//增加过后,也要把这个,返回索引值
        return {fileIndex: file_index, dhIndex: that.dhlist.length - 1};
    },
    init: function (options) {//初始化数据
        var that = this;
        that.player = options.player || 0;
        that.parser = options.parser || 0;
        that.player.onFinished = function () {//这个不是播放完成执行的函数
            console.info("finished!");
        };
        that.clearData();
        that.player.loops = 1;
        that.player.clearsAfterStop = true;
        that.player.onFrame(function (res) {//帧数
            // console.info(res);
        });
        that.player.onPercentage(function (res) {//播放进度
            // console.info(res);
            if(res==1){//播放完了,则删除这个动画
                console.info(that.stData.dhIndex);
                that.dhlist.splice(that.stData.dhIndex,1);
                that.play();//继续播放
            }
        });
    },
    getFirstLoaded: function () {
        var that = this;
        for (var i in that.dhlist) {
            if (that.filelist[that.dhlist[i].fileIndex].loaded == 1) {//即文件已经加载了
                return {fileIndex: that.dhlist[i].fileIndex, dhIndex: i, file: that.filelist[that.dhlist[i].fileIndex]};
            }
        }
        return {fileIndex: -1, dhIndex: -1, file: {}, dh: {}};
    },
    preload: function () {//预加载

    },
    dhlist: [],
    push: function () {//向尾部追加

    },
    pop: function () {//从头部

    },
    play_01: function () {//不是按顺序播放
        var that = this;
        if(that.dhlist.length==0){
            return false;
        }
        var fo = that.getFirstLoaded();//得到第一个加载的。不一定是按顺序播放的,如果要是按顺序放的,则只播放第0个就可以了,然后删除第0个
        // console.info(fo);
        if (fo.fileIndex < 0) {//即没有,则调用自身//但需要延时调用自身
            setTimeout(function () {
                console.info(fo);
                that.play();///则调用自身
            }, 1000);
        } else {//播放,
            //
            console.info(fo);
            that.player.clearsAfterStop = true;
            that.stData.dhIndex = parseInt(fo.dhIndex);
            that.player.setVideoItem(fo.file.videoItem);
            that.player.startAnimation();
        }

    },
    play: function () {//按顺序播放,则一定要等到第一个加载完成,播放完就删除
        var that = this;
        if(that.dhlist.length==0){
            return false;
        }
        // console.info(fo);
        if (that.filelist[that.dhlist[0].fileIndex].loaded !=1) {//即没加载,则一直尝试着
            setTimeout(function () {
                that.play();///则调用自身
            }, 1000);
        } else {//播放,
            //
            that.player.clearsAfterStop = true;
            that.stData.dhIndex=0;//始终播放第一个
            that.player.setVideoItem(that.filelist[that.dhlist[0].fileIndex].videoItem);
            that.player.startAnimation();
        }

    },
    del: function () {

    }
};

调用代码如下图

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

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

相关文章

沉浸式观影怎么能少得了投影仪?极米轻薄投影极米Z7X了解一下

近段时间&#xff0c;各个平台好剧不断&#xff0c;《以爱为营》《宁安如梦》《乐源游》《无所畏惧》等优质好剧陆续开播&#xff0c;让剧迷们直呼看不过来。优质好剧已经开场&#xff0c;看好剧的装备当然也不能落下。现如今&#xff0c;大屏追剧已成潮流,极米Z7X陪大家一起开…

【笔记】Clion 中运行 C/C++11 之 CMakeLists.txt 的配置

该文章记录第一次使用 Clion 时&#xff0c;对 CMakeLists 的配置&#xff0c;使其能够运行 C/C11 的代码。 一. CMakeLists.txt 的配置 1、首先我们在需要新建一个项目 2、填写新建项目相关的信息 3、修改 CMakeLists.txt 文件内容 替换文本&#xff1a; # 使用此 CMakeLis…

两道面试题秒杀你的C++基础!

大家好&#xff0c;我是光城&#xff0c;今天发两个非常重要的面试题&#xff0c;可以留言区说出你的答案&#xff0c;这两个题目都比较重要&#xff0c;看你能答对不&#xff1f; 1.C中初始化变量有几种方式&#xff0c;各自有什么区别&#xff1f; 或者说Initialization分为哪…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深&#xff0c;对于数据如何作用于经济发展&#xff0c;数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

MySQL性能调优-1-实际优化案例

关于SQL优化的思路&#xff0c;一般都是使用执行计划看看是否用到了索引&#xff0c;主要可能有两大类情况&#xff1a; 对业务字段建立了二级联合索引&#xff0c;但是MySQL错误地觉得走主键聚族索引全表扫描效率更高&#xff0c;而没有走二级索引 走二级索引&#xff0c;但…

LLM | 一文了解大语言模型中的参数高效微调(PEFT)

Parameter Efficient Fine Tuning(PEFT)也就是参数高效微调&#xff0c;是一种用于微调大型语言模型 &#xff08;LLM&#xff09; 的方法&#xff0c;与传统方法相比&#xff0c;它有效地降低了计算和内存需求。PEFT仅对模型参数的一小部分进行微调&#xff0c;同时冻结大部分…

9款热门API接口分享,值得收藏!

电商API接口 干货分享 开始 “ API是什么&#xff1f; API的主要目的是提供应用程序与开发人员以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口&#xff0c;故而是一种抽象…

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果&#xff0c;并且能够实时实现。 其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。 具体步骤&#xff1a; 1、生成shadowmap 2、在进行阴影的比较时候进行平均&#xff0c;并非之前的shadow map 或者之后完全的阴影…

Xshell全局去除提示音

使用Xshell的时候经常会按TAB或者一些操作指令的时候的时候听到提示音&#xff0c;非常的烦 通常来说在Xshell中可以单独修改每一个会话的属性&#xff0c;将提示音关闭&#xff0c;但是新增的会话依然带有提示音&#xff0c;还得一个个的关闭&#xff0c;非常麻烦&#xff0c;…

【risc-v】易灵思efinix FPGA riscv 时钟配置的一些总结

系列文章目录 分享一些fpga内使用riscv软核的经验&#xff0c;共大家参考。后续内容比较多&#xff0c;会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 文章目录 系列文章目录前言一、pan…

spring boot 事件机制

目录 概述实践监听spring boot ready事件代码 源码初始化流程调用流程 结束 概述 spring boot 版本为 2.7.17 。 整体看一下spring及spring boot 相关事件。 根据下文所给的源码关键处&#xff0c;打上断点&#xff0c;可以进行快速调试。降低源码阅读难度。 实践 spring…

EasyRecovery易恢复2024最新免费版电脑数据恢复软件功能介绍

EasyRecovery从&#xff08;易恢复2024&#xff09;支持恢复不同存储介质数据&#xff0c;在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷&#xff0c;甚至还可以从初始化磁盘。同时&#xff0c;你只需要最简单的操作就可以恢复数据文件&#xff0c;如&#xff1…

Ubuntu常用必会Nslookup指令

文章目录 Nslookup是什么&#xff1f;Ubuntu Nslookup工具安装方法Nslookup工具语法常用Nslookup指令为什么必会Nslookup指令Nslookup的平行替代工具Nslookup和ping的区别推荐阅读 Nslookup是什么&#xff1f; 它是一个很小但功能非常强大的网络管理命令行软件。Nslookup命令可…

音频处理关键知识点

1 引言 现实生活中&#xff0c;我们听到的声音都是时间连续的&#xff0c;我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。 目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号…

POJ 3734 Blocks 动态规划(矩阵的幂)

一、题目大意 我们要给排成一行的区块涂颜色&#xff0c;可以选择红、绿、蓝、黄四种&#xff0c;要求红和绿的块都必须是偶数个&#xff0c;求出最终的涂色方式&#xff0c;对10007取余。 二、解题思路 我们设三个数列A&#xff0c;B和C&#xff1a; 1、A代表红色和绿色都…

SSL证书价格一年多少钱?

SSL证书价格一年多少钱并没有一个固定的答案&#xff0c;它取决于多种因素&#xff0c;包括您选择的证书类型、品牌、提供商以及您希望保护的域名数量等。 首先&#xff0c;我们需要了解SSL证书的种类。根据品牌和类型&#xff0c;SSL证书大致可分为域名认证SSL证书&#xff08…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

成品短视频app源码开发,你需要知道的最新动向

随着移动互联网的快速发展&#xff0c;短视频行业正迅速崛起。越来越多的创业者和开发者将目光投向了成品短视频app源码开发领域。下面我们将深入探讨这一领域的最新动向&#xff0c;带您了解成品短视频app源码开发的趋势与前景 成品短视频app源码开发的前景和机遇 短视频内容…

Latex正文引用图片编号,防止某张图片删除或调整导致正文序号对应错误

一、背景 Latex真的是非常好用的论文排版工具&#xff0c;虽然不像word一样是“所见即所得”的可视化方式&#xff0c;但完全不用管格式&#xff0c;包括图片的排版&#xff0c;文字的缩进等等。这在word里调整起来真的是非常麻烦&#xff0c;特别是某个段落、图片修改后&…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候&#xff0c;把眼镜拿给老板他几分钟就搞定眼镜清洗的&#xff0c;是的没有错&#xff0c;那个机器叫超声波清洗机&#xff0c;不需要自己动手就可把眼镜清洗干净的一款智能清洁工具&#xff0c;它的出现可以说是方便了我…