HTML5 Canvas Konva 动画教程
如需使用 Konva 创建自定义动画,可以使用 Konva.Animation
构造函数。此构造函数接受两个参数:必需的更新函数,以及
可选的图层或图层数组。每个动画帧都会更新这些图层。
动画函数会收到一个 frame 对象。其 time 属性表示动画已经运行的
毫秒数。timeDiff 属性表示自上一帧以来经过的
毫秒数。frameRate 属性表示当前帧率,
单位为每秒帧数。
更新函数绝不能重绘舞台或图层,因为动画引擎会自动处理重绘。
更新函数应仅包含更新节点属性的逻辑,
例如 position、rotation、scale、width、height、radius 和 colors 等。
创建动画后,可以随时使用 start() 方法启动它。
如需查看完整的属性和方法列表,请参阅 Konva.Animation 文档。
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight, }); const layer = new Konva.Layer(); stage.add(layer); const rect = new Konva.Rect({ x: 50, y: 50, width: 50, height: 50, fill: 'green', }); layer.add(rect); const anim = new Konva.Animation(function(frame) { const time = frame.time; const timeDiff = frame.timeDiff; const frameRate = frame.frameRate; // Example: move rectangle in a circle const radius = 50; const x = radius * Math.cos(frame.time * 2 * Math.PI / 2000) + 100; const y = radius * Math.sin(frame.time * 2 * Math.PI / 2000) + 100; rect.position({ x, y }); }, layer); anim.start();
import { Stage, Layer, Rect } from 'react-konva'; import { useEffect, useRef } from 'react'; const App = () => { const rectRef = useRef(null); useEffect(() => { const anim = new Konva.Animation((frame) => { const time = frame.time; const timeDiff = frame.timeDiff; const frameRate = frame.frameRate; // Example: move rectangle in a circle const radius = 50; const x = radius * Math.cos(frame.time * 2 * Math.PI / 2000) + 100; const y = radius * Math.sin(frame.time * 2 * Math.PI / 2000) + 100; rectRef.current.position({ x, y }); }, rectRef.current.getLayer()); anim.start(); return () => { anim.stop(); }; }, []); return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Rect ref={rectRef} x={50} y={50} width={50} height={50} fill="green" /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer ref="layerRef"> <v-rect ref="rectRef" :config="rectConfig" /> </v-layer> </v-stage> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; import Konva from 'konva'; const stageSize = { width: window.innerWidth, height: window.innerHeight }; const rectConfig = ref({ x: 50, y: 50, width: 50, height: 50, fill: 'green' }); const layerRef = ref(null); const rectRef = ref(null); let anim = null; onMounted(() => { anim = new Konva.Animation((frame) => { const time = frame.time; const timeDiff = frame.timeDiff; const frameRate = frame.frameRate; // Example: move rectangle in a circle const radius = 50; const x = radius * Math.cos(frame.time * 2 * Math.PI / 2000) + 100; const y = radius * Math.sin(frame.time * 2 * Math.PI / 2000) + 100; rectRef.value.getNode().position({ x, y }); }, layerRef.value.getNode()); anim.start(); }); onUnmounted(() => { if (anim) { anim.stop(); } }); </script>