本次解析将分为2篇文章,当前是第二篇,第一篇在这里

另外,为了能更好的理解这个库,个人写了一个此库的压缩版,实现了核心的功能(主要也是为了更好理解核心功能),内容更少方便阅读,
地址在这里


继续上一篇,先把结构图拉过来:

// anime主体
function anime(params){// 定义instance 也是最终返回值let instance = createNewInstance(params);// 外部API 从当前位置开始执行动画instance.play = function() {}// 配置 startTime 和 engineTime(关键)instance.tick = function(t) {}// 对当前engineTime进行判断,确定动画方案(关键)function setInstanceProgress(engineTime) {}// 计算动画当前位置 并且赋值(关键)function setAnimationsProgress(insTime){}// 直接跳到参数time的时间所在的位置instance.seek = function(time) {}// 外部API 暂停instance.pause = function() {}// 外部API 反转instance.reverse = function() {}// 外部API resetinstance.reset = function() {}// 外部API 重新开始instance.restart = function() {}/*...*/return instance
}
  • setAnimationsProgress(省略了一些配置的定义)

这个函数接受一个参数,就是当前位置所消耗时间(动画起始点),然后在里面计算出每一个动画目标的位置,并且赋值

// 计算动画当前位置 并且赋值
function setAnimationsProgress(insTime) {/* ... */// 这个while逐个计算当前实例中的每个动画的当前位置(通过时间和算法)while (i < animationsLength) {/* ... */// 消耗的时间占总持续时间的比例 在起点终点之间const elapsed = minMaxValue(insTime - tween.start - tween.delay, 0, tween.duration) / tween.duration;// 通过算法计算当前进度const eased = isNaN(elapsed) ? 1 : tween.easing(elapsed, tween.elasticity);/* ... */// 遍历每一个到达点执行for (let n = 0; n < toNumbersLength; n++) {let value;const toNumber = tween.to.numbers[n];const fromNumber = tween.from.numbers[n];if (!tween.isPath) {// 计算当前具体位置value = fromNumber + (eased * (toNumber - fromNumber));} else {// 进行SVG path计算value = getPathProgress(tween.value, eased * toNumber);}/* ... */numbers.push(value);}/* ... */if (!isNaN(n)) {// 组合单位 '135.546'+'px'if (!b) {progress += n + ' ';} else {progress += n + b;}}/* ... */// 组合结果 'translateX('+'135.546px'+')`setTweenProgress[anim.type](animatable.target, anim.property, progress, transforms, animatable.id);anim.currentValue = progress;i++;}// 遍历结果,逐个target赋值const transformsLength = Object.keys(transforms).length;if (transformsLength) {for (let id = 0; id < transformsLength; id++) {if (!transformString) {const t = 'transform';// 配置兼容性transformString = (getCSSValue(document.body, t) ? t : `-webkit-${t}`);}// 设置styleinstance.animatables[id].target.style[transformString] = transforms[id].join(' ');}}// 记录当前位置所对应的时间instance.currentTime = insTime;// 设置进度instance.progress = (insTime / instance.duration) * 100;
}

剩下的就是一些操作函数了:

  • instance.seek
// 直接跳到参数time的时间所在的位置
instance.seek = function(time) {setInstanceProgress(adjustTime(time));
}
  • instance.pause
// 外部API 暂停
instance.pause = function() {const i = activeInstances.indexOf(instance);// 删除activeInstances 后续engine中找不到便不会执行if (i > -1) activeInstances.splice(i, 1);instance.paused = true;
}
  • instance.reverse
// 外部API 反转
instance.reverse = function() {toggleInstanceDirection();startTime = 0;lastTime = adjustTime(instance.currentTime);
}
  • instance.restart
// 外部API 重新执行
instance.restart = function() {instance.pause();instance.reset();instance.play();
}
  • instance.reset
// 外部API reset
instance.reset = function() {const direction = instance.direction;const loops = instance.loop;// 当前位置,进度 归零instance.currentTime = 0;instance.progress = 0;instance.paused = true;instance.began = false;instance.completed = false;instance.reversed = direction === 'reverse';instance.remaining = direction === 'alternate' && loops === 1 ? 2 : loops;setAnimationsProgress(0);for (let i = instance.children.length; i--; ){instance.children[i].reset();}
}

总结

  1. 使用了requestAnimateFrameCSS动画提高流畅度。
  2. 使用了缓动函数,只需要通过当前动画消耗的时间,搭配其他定义的配置项,就可以计算出当前动画具体位置。

此次解析就到这里结束,如有错误,请指出,感谢!

[源码阅读]解析Anime(JS动画库)核心(2)相关推荐

  1. 淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树

    http://blog.csdn.net/qq910894904/article/details/28658421 OceanBase是阿里巴巴集团自主研发的可扩展的关系型数据库,实现了跨行跨表的事务 ...

  2. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划

    淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...

  3. 【笔记-vue】《imooc-vue.js高仿饿了么》、《imooc-vue 音乐app》、《imooc-vue.js源码全方位解析》

    20170709 - 20171128:<imooc-vue.js高仿饿了么> 一.第一章 课程简介 1-1课程简介 1.需求分析-脚手架工具-数据mock-架构设计-代码编写-自测-编译 ...

  4. koa源码阅读之koa-compose/application.js

    koa源码阅读之koa-compose/application.js koa-Compose 为了理解方便特地把注释也粘进来 //这英语.我也来翻译一波 //大概就是把所有的中间件组合返回一个完整大块 ...

  5. mybatis源码阅读(三):mybatis初始化(下)mapper解析

    转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...

  6. HashMap jdk1.7源码阅读与解析

    转载自  HashMap源码阅读与解析 一.导入语 HashMap是我们最常见也是最长使用的数据结构之一,它的功能强大.用处广泛.而且也是面试常见的考查知识点.常见问题可能有HashMap存储结构是什 ...

  7. Mybatis源码阅读(一):Mybatis初始化1.1 解析properties、settings

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  8. animejs走马灯_web前端攻城狮超爱的JS动画库插件—anime.js

    作为一名web前端攻城狮,除了完成日常业务逻辑处理之外,也会去注重一些用户体验交互的问题.特别是如今web前端的发展很快,很多优秀js插件层出不穷.对于web前端开发者,也要会利用这些现有的js插件, ...

  9. 【SeaJS】【3】seajs.data相关的源码阅读

    在SeaJS官网上推荐了源码阅读顺序,本文并没有采用这个顺序,而是按个人习惯以调试官方示例的方式进行源码阅读.早期版本作者玉伯使用了几个闭包形式,本文源码版本为2.1.1,它的编码方式个人认为更加脚本 ...

  10. cocos creator 游戏源码_Cocos Creator 3D引擎源码阅读之授之以渔 源码阅读

    源码阅读 动静之法 静 找到引擎源码的所在 在编辑器的右上角有一个大按钮 在VSCode里开打engine目录 引擎源码就在红色标中的cocos文件夹里,如下图 让我们来看一下引擎的目录结构 可以看到 ...

最新文章

  1. Bean的生命周期——init-method和destroy-method - 通过让Bean实现InitializingBean,DisposableBean--BeanPostProcessor
  2. nginx ngx_http_core_module 模块中文文档
  3. windows7下面sublime中使用virtualenv切换python版本并运行
  4. Spring boot 系列 入门--配置
  5. m1系统怎么重装,m1芯片怎么重装系统,苹果M1芯片重装系统,m1芯片重新安装mac
  6. 栈(后缀表达式的理想数据结构)
  7. 生于凛冬的私募资产配置基金管理人能否秽土转生?
  8. 对做的一个小的C++聊天室的总结
  9. 网上零食销售系统(Java;JSP;JDBC)附源码+数据库+论文
  10. 混合线性模型学习笔记2
  11. rational rose导出sql脚本
  12. 心中有佛,看谁都是佛;心中有屎,看谁都是屎。
  13. 连接SQLserver数据库发生错误,提示用户sa登录失败解决方法(亲试有用)
  14. ngx-datatable
  15. 卸载 kubernetes
  16. python教程99--控制鼠标键盘模块 pyautogui
  17. 操作系统--操作系统
  18. 深天马A去年实现净利润9.84亿元 同比减少35.88%
  19. Python深度学习之计算机视觉
  20. 【linux】循序渐进学运维-printf

热门文章

  1. 小程序通过background-image设置背景图片
  2. WebSphere概述
  3. C#-Event事件
  4. spring data JPA的使用
  5. 施耐德PM5350电度表电能数据解析
  6. 开源交通仿真平台SimMobility的安装教程
  7. 广义线性模型之指数分布族期望和方差的推导
  8. 开源APM性能检测系统技术选型与架构实战
  9. 吉他调音器(1)之十二平均律
  10. 如何给计算机d盘加密码,怎样给电脑文件夹加密