详解tween.js的使用教程


Posted in Javascript onSeptember 14, 2017

前面的话

TweenJS提供了一个简单但强大的渐变界面。它支持渐变的数字对象属性&CSS样式属性,并允许链接补间动画和行动结合起来,创造出复杂的序列。本文将详细介绍tween.js的使用

 概述

tween.js允许以平滑的方式修改元素的属性值。只需要告诉tween想修改什么值,以及动画结束时它的最终值是什么,动画花费多少时间等信息,tween引擎就可以计算从开始动画点到结束动画点之间值,来产生平滑的动画效果

例如,假设有一个对象position,它的坐标为 x 和 y:

var position = { x: 100, y: 0 }

如果想改变 x 的值从100到200,只需要这样做:

// Create a tween for position first
var tween = new TWEEN.Tween(position);
 
// Then tell the tween we want to animate the x property over 1000 milliseconds
tween.to({ x: 200 }, 1000);

到这里只是创建了tween对象,需要激活它,让它开始动画:

// And set it to start
tween.start();

最后为了平滑动画效果,需要在同一个循环动画中调用TWEEN.update方法。代码如下:

animate();
 
function animate() {
  requestAnimationFrame(animate);
  // [...]
  TWEEN.update();
  // [...]
}

这个动作将会更新所有被激活的tweens,在1秒钟(例如1000ms)position.x 将变为200。

也可以使用onUpdate回调函数将结果打印到控制台上

tween.onUpdate(function() {
  console.log(this.x);
});

这个函数在每次tweens被更新时都被调用。它的出现频次依赖于很多因素。例如:依赖于你的电脑或设备的运行速度

开始动画

Tween.js本身不会运行,需要通过update方法明确的告诉它什么时候开始运行。推荐在动画主循环中使用该方法。可以通过调用requestAnimationFrame方法来获得良好的图像性能

animate();
 
function animate() {
  requestAnimationFrame(animate);
  // [...]
  TWEEN.update();
  // [...]
}

这里使用无参数调用方式,update方法将明确当前时间,以便于获取上一次动画的执行时间。

也可以为update方法明确一个时间:

TWEEN.update(100);

上面语句的意思是说:update的时间=100毫秒。可以使用这种方法来明确代码中所有随时间变化的函数。例如,动画已经开始,想所有动画都同步进行,animate代码改成这样:

var currentTime = player.currentTime;
TWEEN.update(currentTime);

控制动画

【start和stop】

Tween.start和Tween.stop分别用于控制tween动画的开始和结束

对于已经结束和没有开始的动画,Tween.stop方法不起作用。Tween.start方法同样接收一个时间参数。如果使用了该参数,tween动画将在延时该时间数后才开始动画。否则它将立刻开始动画

【update】

可以通过TWEEN.update方法来执行动画的更新

【chain】

如果你制作多个多行,例如:一个动画在另一个动画结束后开始。可以通过chain方法来使实现。如下代码,tweenB 在 tweenA 之后开始动画

tweenA.chain(tweenB);

可以像下面这样制作一个无限循环的动画:

tweenA.chain(tweenB);
tweenB.chain(tweenA);

【repeat】

如果你制作循环动画可以使用chain来实现,但是更好的方法是使用repeat方法。它接收一个用于描述想循环多少次的参数

tween.repeat(10); // repeats 10 times and stops
tween.repeat(Infinity); // repeats forever

【yoyo】

这个函数只在使用repeat方法时起作用。当它被激活时,tween的效果类似yoyo球效果。该效果是动画会在开始或结束处向反方向反弹

【delay】

delay方法用于控制动画之间的延时

tween.delay(1000);
tween.start();

全局方法

以下的方法定义在 TWEEN 的全局对象中,其中大多数方法都用不上,除了update方法:

【TWEEN.update(time)】

该方法用于所有被激活的tweens,如果time没有被指定,将使用当前时间。

【TWEEN.getAll 和 TWEEN.removeAll】

这两个方法用于获取被激活的tweens数组的一个引用,或从数组中删除所有tweens。

【TWEEN.add(tween) 和 TWEEN.remove(tween)】

用于向被激活的tweens中添加一个tween,或移除一个tween

easing函数

tween.js提供了一些可用的easing函数。可用函数有:Linear, Quadratic, Cubic, Quartic, Quintic, Sinusoidal, Exponential, Circular, Elastic, Back 和 Bounce。easing 类型分为: In, Out 和 InOut

不但可以使用tween.js提供的easing函数,还可以自定义easing函数。但必须遵守下面的规则

1、它必须接收一个参数

2、它必须基于输入参数返回一个值

easing函数仅在每个tween每次被更新时调用,而不管有多少属性被改变。结果随后会被用于初始值

easedElapsed = easing(k);
for each property:
  newPropertyValue = initialPropertyValue + propertyDelta * easedElapsed;

下面是一个使用Math.floor来做easing效果的例子:

function tenStepEasing(k) {
  return Math.floor(k * 10) / 10;
}

可以在tween 这样使用它

tween.easing(tenStepEasing);

回调函数

另外一个有用的特性是可以在每次tween循环周期的指定时间点调用自定义的函数。

例如:假设想使一些不能直接修改参数的对象执行动画,要访问该对象的参数只能通过setter方法,可以通过update方法的回调函数来设置新的setter值

var trickyObjTween = new TWEEN.Tween({
  propertyA: trickyObj.getPropertyA(),
  propertyB: trickyObj.getPropertyB()
})
  .to({ propertyA: 100, propertyB: 200 })
  .onUpdate(function() {
    this.setA( this.propertyA );
    this.setB( this.propertyB );
  });

或者如果想确认tween动画开始后某个对象指定状态下的某个值,可以通过start回调来获取它:

var tween = new TWEEN.Tween(obj)
  .to({ x: 100 })
  .onStart(function() {
    this.x = 0;
  });

【onStart】

tween开始动画前的回调函数。

【onStop】

tween结束动画后的回调函数。

【onUpdate】

在tween每次被更新后执行。

【onComplete】

在tween动画全部结束后执行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JsEasy简介 JsEasy是什么?与下载
Mar 07 Javascript
js实现iframe动态调整高度的代码
Jan 06 Javascript
jquery 应用代码 方便的排序功能
Feb 06 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
Feb 03 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
May 28 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
vue使用自定义指令实现拖拽
Jan 29 Javascript
微信小程序HTTP请求从0到1封装
Sep 09 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
十分钟教你上手ES2020新特性
Feb 12 Javascript
JS库之wow.js使用方法
Sep 14 #Javascript
JavaScript正则表达式和级联效果
Sep 14 #Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 #Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 #Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 #Javascript
JS中跳出循环的示例代码
Sep 14 #Javascript
JS验证码实现代码
Sep 14 #Javascript
You might like
社区(php&&mysql)四
2006/10/09 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
js 操作符实例代码
2009/10/24 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python实现桌面托盘气泡提示
2019/07/29 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
python同时遍历两个list用法说明
2020/05/02 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
业务员岗位职责
2015/02/03 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
Nginx HTTP跳转至HTTPS
2022/05/15 Servers
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers