KineticJS教程4:图形变换与动画

类别:    标签: 编程 js   阅读次数:   版权: (CC) BY-NC-SA

2015-06-11 08:27:22

7. 图形变换

7.1. 线性变换

Kinetic提供了一个图形对象的Tween(config)方法实现图形的线性变换, 也就是从原始的状态线性变换到新的状态, 这里的状态是指的尺度上的参数. 方法的config参数也就是有关图形尺度的一些参数, 比如x, y, rotation, width, height, radius, strokeWidth, alpha, scale, centerOffset等. 除了这些尺度参数, 还需要一个duration参数, 单位是秒, 也就是指定这种线性变换是在多长时间内变换完成.

比如, 下面代码实现图形在两秒钟内从原位置移动到(400, 30)处, 并旋转360度, 增大为原来的1.5倍, 边缘线加粗, 且逐渐变得不透明:

# Language: js
<script>
	var tween = new Kinetic.Tween({
		node: rect,
		duration: 1,
		x: 400,
		y: 30,
		rotation: 360,
		opacity: 1,
		strokeWidth: 6,
		scaleX: 1.5
	});

	// start tween after 2 seconds
	setTimeout(function() {
		tween.play();
	}, 2000);
</script>

运行效果如下(若看不到效果, 请刷新页面):

7.2. 变换中的速度

KineticTween(config)方法中的config参数包括一个easing属性, 是指变换是以较均匀的速度到达变换目的点还是在变换过程中在不同位置以不同速度进行变换. easing可以设定的值包括Linear, EaseIn, EaseOut, EaseInOut, BackEaseIn, BackEaseOut, BackEaseInOut, ElasticEaseIn, ElasticEaseOut, ElasticEaseInOut, BounceEaseIn, BounceEaseOut, BounceEaseInOut, StrongEaseIn, StrongEaseOut以及StrongEaseInOut.

easing的使用方法如下

# Language: js
<script>
	var tween = new Kinetic.Tween({
		node: rect,
		duration: 1,
		easing: Kinetic.Easings["BounceEaseIn"],
		x: 400,
		y: 30,
		rotation: 360,
		opacity: 1,
		strokeWidth: 6,
		scaleX: 1.5
	});
</script>

在文章里很难形容这些值之间的不同, 还是具体写成代码, 在浏览器里看效果吧.

7.3. 变换完成后的回调方法

KineticTween(config)方法中的config参数还包括一个OnFinish方法属性, 这个方法会在变换完成后被执行.

# Language: js
<script>
	var tween = new Kinetic.Tween({
		node: rect,
		duration: 1,
		onFinish: function() {
			alert("complete!");
		},
		x: 400,
		y: 30,
		rotation: 360,
		opacity: 1,
		strokeWidth: 6,
		scaleX: 1.5
	});
</script>

运行效果如下(若看不到效果, 请刷新页面):

7.4. 变换的开始与结束

当执行tween方法的时候可以使用play(), pause(), reverse(), reset(), finish()seek()方法来控制对象的变换行为.

使用方法如下:

# Language: js
<script>
	var tween = new Kinetic.Tween(config)
	
	// 开始变换
	tween.play();

	// 暂停变换
	tween.pause();

	// 重置
	tween.reset();
</script>

演示效果如下:

8. 动画

动画就是一帧帧的画面按照时间间隔显示出来, Kinetic给我们提供了animation对象, 它可以绑定一个动画方法, 我们要显示的动画的每一帧画面就是在这个方法中完成绘制的.

其中, 这个方法接受一个对象frame为参数, 此参数对象包含两个属性, 一个是frame.time, 表示当前帧是动画开始后的毫秒数, 另一个属性是frame.timeDiff, 表示的是当前帧与上一帧之间的时间毫秒差. 当前帧应该是什么形态就是根据这两个参数来判断的. 绘制出当前帧后, 注意要调用一下动画所在的层的draw, 将当前帧图像显示到屏幕上. 动画的开始与停止是用对象的startstop方法实现的.

如下代码显示了一个左右摆动的圆形

# Language: js
<script>
	var stage = new Kinetic.Stage({
		container: 'container',
		width: 578, height: 200
	});
	var layer = new Kinetic.Layer();

	var circle = new Kinetic.Circle({
		x: stage.width()/2,
		y: stage.height()/2,
		sides: 6,
		radius: 70,
		fill: 'red',
		stroke: 'black',
		strokeWidth: 4
	});

	layer.add(circle);
	stage.add(layer);

	var amplitude = 150;
	var period = 2000;
	var centerX = stage.width()/2;
	
	//动画帧定义方法
	var anim = new Kinetic.Animation(function(frame) {
		circle.setX(amplitude * Math.sin(frame.time * 2 * Math.PI / period) + centerX);
	}, layer);
	
	anim.start(); //动画开始

	//stage.stop(); //动画停止
</script>

运行效果如下:

随意赞赏

微信

支付宝
◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: KineticJS教程3:事件响应与拖曳
后一篇: KineticJS教程5:选择器

访问人次(2015年7月 9日起): | 最后更新: 2017-09-26 07:50:25 UTC | 版权所有 © 2008 - 2017 Jerkwin