svga动画

本文介绍的动画不是css,js动画,是使用插件播放svga文件。

1.需求

UI同学在做一个春节活动,活动中需要有个开场动画,原本想的简单,不涉及接口调用逻辑,就直接用做一个gif图片由前端来显示就好了,但是这个gif做出来之后图片太大了,页面加载慢,如下图1

gif图片还有一个问题,透明部分会显示成黑色,不符合预期。再者就是这个图片太大了,有1.3M。

后来UI同学换了一种格式,apng动画,APNG(Animated Portable Network Graphics)诞生于2004年,是PNG的位图动画扩展。可以简单地理解为PNG格式的动画版。但是UI同学做出来文件体积更大了,这个文件有2.9M,如下图2

最后UI同学尝试使用svga动画,这种格式动画体积小,只有33kb,但是有个问题svga文件不能在浏览器中直接播放,需要引用第三方插件,就诞生了这个需求。

2.思路

说是思路,其实就是使用svga插件来播放这个动画文件,官方已经有说明文档,只要照着这个文档来写就可以实现。

3.实现过程

这个项目是使用svelte来实现的,这个框架和vue有些类似,这里不展开说明,只介绍如何实现这个播放功能。

3.1 canvas容器

svga播放使用canvas容器来播放,html代码如下图:

<!-- svga播放器 -->
<canvas class="{['play-canvas', className].join(' ')}" on:click={onClick} bind:this={svgaCanvasEl}></canvas>

3.2 播放器

初始化播放器参考官方文档照葫芦画瓢了,代码如下:

<script>
import { onMount, onDestroy, createEventDispatcher } from 'svelte'
import { Parser, Player } from 'svga'
import {regExp} from '@/shared/internal/constants' //事件转发
const dispatch = createEventDispatcher()
//svg容器
let svgaCanvasEl = null
//svg播放器
let player = null
//解析
let parser = null
//组件样式
export let className = ''
//svga图片地址
export let svgaUrl = ''
//暴露svga动画配置
export let playerConfig = {
loop: 0, //循环次数,默认值 0(无限循环)
}
//样式
export { className as class } const initSvgAnimation = async () => {
if (svgaUrl) {
try {
if (!regExp.svgaSuffix.test(svgaUrl)) {
throw 'inaccurate file format'
}
parser = new Parser()
const svga = await parser.load(svgaUrl)
player = new Player({
container: svgaCanvasEl,
fillMode: 'backwards', // 最后停留的目标模式,默认值 forwards
playMode: 'forwards', //播放顺序顺序播放
loop: 1,
startFrame: 0,
endFrame: svga.frames,
isUseIntersectionObserver: false,
isCacheFrames: false,
...playerConfig
})
await player.mount(svga)
player.onStart = () => console.log('svg play onStart')
player.onResume = () => console.log('svg play onResume')
player.onPause = () => console.log('svg play onPause')
player.onStop = () => console.log('svg play onStop')
player.onProcess = () => {}
player.onEnd = () => console.log('onEnd')
await player.start()
} catch (e) {
console.error('svg play error:', e)
}
}
} function onClick() {
dispatch('click')
} onMount(() => {
initSvgAnimation()
}) onDestroy(() => {
// 清空动画
player && player.clear() && player.destroy()
// 销毁
parser && parser.destroy()
})
</script>

3.3调用方式

调用方式如下:

<SvgaPlayer svgaUrl={popUpImg} playerConfig={playerConfig} class={"pageload-pop-svg"}></SvgaPlayer>

注意传入两个参数中第一个是svga文件地址,可以是本地或者远程cdn地址,第二个参数playerConfig是播放配置,覆盖默认配置,参考官方文档。

最后效果如下:

参考:

https://baijiahao.baidu.com/s?id=1681715610129777960&wfr=spider&for=pc

https://github.com/svga/SVGAPlayer-Web-Lite

抽奖动画 - 播放svga动画的更多相关文章

  1. Android播放gif动画,增加屏幕掉金币效果

    前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下: 2.部分主要代码 Main ...

  2. HTML5骨骼动画Demo | 使用min2d、createjs、pixi播放spine动画

    Spine做骨骼动画是比较流行的,使用起来可能相对复杂,但功能毕竟强大,所以市场占有率较大. 在unity.cocos2d.starling中使用spine已经很成熟了,而HTML5这一块可能刚刚起步 ...

  3. android 通过帧动画方式播放Gif动画

    注意:经过本人测试,这个方法很耗内存, 图片一多就崩了.慎用 <1>用工具(photoshop或者FireWorks)将GIF动画图片分解成多个GIF静态图片,然后保存在res\drawa ...

  4. cocos2d 播放GIF动画类

    cocos2d 播放GIF动画类 以前项目中曾经用到过,后来因为GIF图像的质量较差,被弃用了,把公司名字去掉分享下,根据网上资料改编的cocos2d-iphone版的. // // CCSprite ...

  5. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇01:播放序列动画》

    1.播放序列动画 系列动画播放概述 2D游戏中的动画系统,不同于3D游戏.3D游戏中,角色美术资源不仅包含角色模型的,还包括角色的贴图和动作等,模型本身自带角色的动作动画效果.2D游戏中,角色美术资源 ...

  6. 【原创】测试不同浏览器播放canvas动画的平滑程度

    Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...

  7. UIImageView~动画播放的内存优化

    我目前学到的知识,播放动画的步骤就是下面的几个步骤,把照片资源放到数组里面,通过动画animationImage加载数组,设置动画播放的 时间和次数完成播放. 后来通过看一些视频了解到:当需要播放多个 ...

  8. Android实现播放GIF动画的强大ImageView

    我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力.确实,比起一张单调的图片,动态图片明显更加的有意思.一般动态图片都是GIF格式的,浏览 ...

  9. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  10. Android 播放Gif 动画

    在Android 中是不支持直接使用Gif 图片关联播放帧动画,如下动画在Android 中是无法播放的: Android 提供了另外一种解决的办法,就是使用AnimationDrawable 这一函 ...

随机推荐

  1. 题解 CF327A Flipping Game

    前言 数据水的一批,\(\mathcal{O}(n^3)\) 给过我觉得是不应该的. 题意 有一个由 \(0\) 和 \(1\) 组成的序列 \(a_1,a_2,a_3,a_4....,a_n\) . ...

  2. Redis管理及监控工具推荐

    推荐一款Redis管理软件.[官网 http://www.redisant.cn/] 功能描述: 1. 键和字段CRUD和glob. 2. 适用于字符串.列表.散列.集合.有序集合. 通过漂亮的用户界 ...

  3. ironic组件硬件自检服务——ironic-inspector

    介绍 ironic-inspector是一个用于硬件自检的辅助型服务,它可以对被ironic组件管理的裸金属节点进行硬件自检,通过在裸金属节点上运行内存系统,发现裸金属节点的硬件信息,例如CPU数量和 ...

  4. natapp内网穿透

    NATAPP 官网地址 https://natapp.cn/ 下载 点击下载,选择符合自己的版本 注册 下载完成后解压是个natapp.exe程序,这里先不用动,回到官网首页 完成注册并登录,选择免费 ...

  5. 优雅的重启uwsgi 告别uwsgi reload过程中造成的无法请求、请求延迟等问题

    [uwsgi]#使用优雅重启 lazy-apps = true #监听monitor文件 当monitor文件发生改变是重启uwsgi touch-chain-reload = /home/monit ...

  6. Day17:稀疏数组的超细详解

    稀疏数组的超细详解 一个含有大量重复元素的二维数组,我们可以提取其有效元素,压缩空间,整合为一个稀疏数组. 例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为0:黑棋为1:白棋为2: ...

  7. # Android网络请求(4) 网络请求框架Volley

    Android网络请求(4) 网络请求框架Volley Volley是Google在2013年5月15日到17日在旧金山Moscone中心举办网络开发者年会中推出的Android异步网络加载框架和图片 ...

  8. Android Studio打开时报错if you already hava 64-bit JDK installed,define a JAVA_HOME

    出现这个问题不知道改了什么导致的,卸载了重新安装也是不行. 以及到高级设置中进行配置jdk也是无效, 解决方法为需要在路径 C:\Users\你自己的用户名\AppData\Roaming\Googl ...

  9. redis集群之主从复制集群的原理和部署

    最近在复盘redis的知识,所以本文开始希望介绍下redis的集群架构.原理以及部署:本文主要介绍redis的主从复制集群,包括其架构模型,原理,高可用等: 一.主从集群的介绍   redis的主从复 ...

  10. day29 jQuery选择器 & jquery属性操作 & jquery DOM元素 操作与遍历

    简介 jQuery,顾名思义,就是javascript和query(查询),即辅助javascript开发的库,本质就是一个js文件: jQuery是一个js函数库,是目前全球范围内最流行.用的最多的 ...