旋转动画教程
要使用 Konva 动画一个形状的旋转,我们可以使用 Konva.Animation
创建一个新动画,并定义一个在每帧动画中修改形状旋转的函数。
在本教程中,我们将围绕左上角旋转一个蓝色矩形,围绕中心旋转一个黄色矩形,以及围绕外部点旋转一个红色矩形。
有关完整的属性和方法列表,请查看 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 blueRect = new Konva.Rect({ x: 50, y: 50, width: 100, height: 50, fill: '#00D2FF', stroke: 'black', strokeWidth: 4, offset: { x: 0, y: 0, }, }); // 黄色矩形 - 围绕中心旋转 const yellowRect = new Konva.Rect({ x: 200, y: 50, width: 100, height: 50, fill: 'yellow', stroke: 'black', strokeWidth: 4, offset: { x: 50, y: 25, }, }); // 红色矩形 - 围绕形状外部点旋转 const redRect = new Konva.Rect({ x: 350, y: 50, width: 100, height: 50, fill: 'red', stroke: 'black', strokeWidth: 4, offset: { x: -50, y: 25, }, }); layer.add(blueRect); layer.add(yellowRect); layer.add(redRect); const angularSpeed = 90; const anim = new Konva.Animation(function(frame) { const angleDiff = (frame.timeDiff * angularSpeed) / 1000; blueRect.rotate(angleDiff); yellowRect.rotate(angleDiff); redRect.rotate(angleDiff); }, layer); anim.start();
import { Stage, Layer, Rect } from 'react-konva'; import { useEffect, useRef } from 'react'; const App = () => { const blueRectRef = useRef(null); const yellowRectRef = useRef(null); const redRectRef = useRef(null); useEffect(() => { const angularSpeed = 90; const anim = new Konva.Animation((frame) => { const angleDiff = (frame.timeDiff * angularSpeed) / 1000; blueRectRef.current.rotate(angleDiff); yellowRectRef.current.rotate(angleDiff); redRectRef.current.rotate(angleDiff); }, blueRectRef.current.getLayer()); anim.start(); return () => { anim.stop(); }; }, []); return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Rect ref={blueRectRef} x={50} y={50} width={100} height={50} fill="#00D2FF" stroke="black" strokeWidth={4} offsetX={0} offsetY={0} /> <Rect ref={yellowRectRef} x={200} y={50} width={100} height={50} fill="yellow" stroke="black" strokeWidth={4} offsetX={50} offsetY={25} /> <Rect ref={redRectRef} x={350} y={50} width={100} height={50} fill="red" stroke="black" strokeWidth={4} offsetX={-50} offsetY={25} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer ref="layerRef"> <v-rect ref="blueRectRef" :config="blueRectConfig" /> <v-rect ref="yellowRectRef" :config="yellowRectConfig" /> <v-rect ref="redRectRef" :config="redRectConfig" /> </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 blueRectConfig = ref({ x: 50, y: 50, width: 100, height: 50, fill: '#00D2FF', stroke: 'black', strokeWidth: 4, offset: { x: 0, y: 0, } }); const yellowRectConfig = ref({ x: 200, y: 50, width: 100, height: 50, fill: 'yellow', stroke: 'black', strokeWidth: 4, offset: { x: 50, y: 25, } }); const redRectConfig = ref({ x: 350, y: 50, width: 100, height: 50, fill: 'red', stroke: 'black', strokeWidth: 4, offset: { x: -50, y: 25, } }); const layerRef = ref(null); const blueRectRef = ref(null); const yellowRectRef = ref(null); const redRectRef = ref(null); let anim = null; onMounted(() => { const angularSpeed = 90; anim = new Konva.Animation((frame) => { const angleDiff = (frame.timeDiff * angularSpeed) / 1000; blueRectRef.value.getNode().rotate(angleDiff); yellowRectRef.value.getNode().rotate(angleDiff); redRectRef.value.getNode().rotate(angleDiff); }, layerRef.value.getNode()); anim.start(); }); onUnmounted(() => { if (anim) { anim.stop(); } }); </script>