热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

svg动画_一款强大的SVG动画转换库

这次介绍一款强大的SVG动画转换http:alexk111.github.ioSVG-Morpheus​alexk111.github.io查了下morph的意思,是

这次介绍一款强大的SVG动画转换

http://alexk111.github.io/SVG-Morpheus/​alexk111.github.io

查了下morph的意思,是一个动词

(使)变形(利用电脑动画制作使图像平稳变换) ; (使) 变化; (使) 改变

先看一下效果

2cd681c3323a700b8cf1e178bcab9d0b.gif

一开始我以为只能切换默认的一些Icon,后来发现它果真是强大,理论上是能动画切换任何SVG的,也支持设置如下的参数

63e7df07719cb247718cbd15fab975bc.png

我做了一下简单的尝试,从左边的同心圆,动画转换到右边的圆角矩形。

786d379ee829435008345daf946af91d.png

下面看放慢到10秒的效果

4a0865f052c4bdecb04c8df82229a22e.gif

本着好奇的精神,我还是略作查看,每当这种动画库想要深入的时候,发现背后全是数学知识。

万事都是冰箱三部曲。

const svgMorpheus = new SVGMorpheus("#icon");

这里主要是看在SVGMorpheus的构造函数里,它做了点什么小动作。

吃进去的是草


挤出的是奶


我们看到在SVGMorpheus内部它已经偷偷地转成了标签,并且和原来的绘图效果完全一致,抠出源码一看

case 'CIRCLE':var cx=nodeItem.getAttribute('cx')*1,cy=nodeItem.getAttribute('cy')*1,r=nodeItem.getAttribute('r')*1;item.path='M'+(cx-r)+','+cy+'a'+r+','+r+' 0 1,0 '+(r*2)+',0a'+r+','+r+' 0 1,0 -'+(r*2)+',0z';
break;

其他诸如等都是有对应的转换方式。

如此第一步把冰箱打开已经完成,可以猜测,之后肯定是在上做文章。

接下来要实现动画就要如此调用

svgMorpheus.to("rect", {duration: 10000
});

再看源码可以知道建立起动画计算主要是调用了

this._setupAnimation(iconId);

首先要有fromto两个形状

this._fromIconItems=clone(this._curIconItems);
this._toIconItems=clone(this._icons[toIconId].items);

由于这两个图形一个是有两个,一个只有一个,所以第一步要先把两者填平,在节点数上一致,填进来的效果也很简单,要么是从无到有,要么是从有到无。

f093cb0bd444ab0bb38712fa6cc03e2a.png

接下来的事情就是每个一对一单挑了,核心就是这个方法

var curves=path2curve(this._fromIconItems[i].path,this._toIconItems[i].path);

先看curves的结果,它把M12,10l36,0a2,2 0 0,1 2,2l0,36a2,2 0 0,1 -2,2l-36,0a2,2 0 0,1 -2,-2l0,-36a2,2 0 0,1 2,-2z这样的字符串,转化成

2888cae453cb74d26103a764469f7623.png

这样的数组。另外不光有path,还有stylerotate的计算。

拿到了起点和终点的对比数据之后,相当于把大象放进了冰箱,就可以开始做显示了,内部也是用的raf

var _reqAnimFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame;
var _cancelAnimFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.oCancelAnimationFrame;

主要看SVGMorpheus.prototype._updateAnimationProgress这个方法,核心就是按照当前进度计算属性变化的值

43cd9d62c788f1bd4aa89ac1744da6f1.png

关上冰箱门的步骤也完成了。

最后我觉得这款动画库是能实现任何图形的动画转换,但是由于需要大量的计算和不停的渲染,致使它在性能上肯定有短板,而作者应该也是意识到这一点,给它的定位是只局限在图标上的动画库。

Javascript library enabling SVG icons to morph from one to the other.

比较可惜的是作者说这个库不再维护了。



推荐阅读
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 翻译 | 编写SVG的口袋指南(上)
    作者:DDU(沪江前端开发工程师)本文是原文翻译,转载请注明作者及出处。简介ScalableVectorGraphics(SVG)是在XML中描述二维图形的语言。这些图形由路径,图 ... [详细]
  • golang源码分析调度概述
    golang源码分析-调度过程概述本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行。在Linux ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
皇家让梦起飞jie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有