2015-06-11 08:27:22
7. 图形变换
7.1. 线性变换
- 原先的
transitionTo
方法在新版本中已经废弃, 改为Tween
方法. 参考这里
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. 变换中的速度
Kinetic
的Tween(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. 变换完成后的回调方法
Kinetic
的Tween(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
, 将当前帧图像显示到屏幕上. 动画的开始与停止是用对象的start
与stop
方法实现的.
如下代码显示了一个左右摆动的圆形
# 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>
运行效果如下: