跳到主要内容

复杂补间教程

对于更复杂的动画,你可以使用 GreenSock Konva 插件。 GreenSock 补间的功能比 Konva 内置补间更强。

此示例演示如何使用 GreenSock 对 fillLinearGradientColorStops 属性执行补间。

操作说明:单击图形,启动包含渐变变化的复杂动画。

import Konva from 'konva';

const width = window.innerWidth;
const height = window.innerHeight;

const stage = new Konva.Stage({
container: 'container',
width: width,
height: height,
});

const layer = new Konva.Layer();

const circle = new Konva.Circle({
x: width / 2,
y: height / 2,
radius: 70,
fillLinearGradientStartPoint: { x: -50, y: -50 },
fillLinearGradientEndPoint: { x: 50, y: 50 },
fillLinearGradientColorStops: [0, 'red', 1, 'yellow'],
stroke: 'black',
strokeWidth: 4,
draggable: true,
});

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

circle.on('click tap', () => {
// using regular Konva tween
const tween = new Konva.Tween({
node: circle,
duration: 1,
scaleX: 1.5,
scaleY: 1.5,
easing: Konva.Easings.EaseInOut,
onFinish: () => {
// scale back with another tween
const tween2 = new Konva.Tween({
node: circle,
duration: 1,
scaleX: 1,
scaleY: 1,
easing: Konva.Easings.BounceEaseOut,
});
tween2.play();
},
});
tween.play();

// manually update gradient
let ratio = 0;
const anim = new Konva.Animation((frame) => {
ratio += frame.timeDiff / 1000;
if (ratio > 1) {
ratio = 0;
}
circle.fillLinearGradientColorStops([
0,
'red',
ratio,
'yellow',
1,
'blue',
]);
}, layer);
anim.start();
setTimeout(() => anim.stop(), 2000);
});