HTML5 Canvas 从角落旋转图形
默认情况下,Konva.Transformer 通过框上方短线末端的旋转锚点来旋转图形。使用 rotateMode 可以选择其他旋转方式:
'handle'(默认)显示旋转锚点。'corners'隐藏旋转锚点。框四个角外侧的不可见区域可以旋转图形,与大多数设计工具一致。指针移到这些区域上时,光标会变为弯曲的箭头,指向对应角的方向。'both'同时启用旋转锚点和角落区域。
缩放锚点位于这些区域之上。因此,拖动角上的锚点会缩放图形,而在锚点外侧拖动会旋转图形。区域的大小是 anchorSize 的两倍。
在所有模式下,旋转时按住 Shift 可将旋转角度吸附到 15 度的倍数。设置 shiftBehavior: 'none' 可禁用此功能。
通过角落区域旋转图形时,transformer.getActiveAnchor() 返回该区域的名称,例如 'rotater-top-left'。旋转锚点的名称是 'rotater'。
操作说明:将指针移到框的某个角外侧,然后拖动以旋转图形。按住 Shift 可吸附旋转角度。
- Vanilla
- React
- Vue
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();
stage.add(layer);
const rect = new Konva.Rect({
x: 80,
y: 80,
width: 160,
height: 90,
fill: '#7dd3fc',
stroke: 'black',
draggable: true,
});
layer.add(rect);
const tr = new Konva.Transformer({
nodes: [rect],
rotateMode: 'corners',
});
layer.add(tr);
import { Stage, Layer, Rect, Transformer } from 'react-konva';
import { useRef, useEffect, useState } from 'react';
const App = () => {
const [rectPosition, setRectPosition] = useState({ x: 80, y: 80 });
const rectRef = useRef();
const trRef = useRef();
useEffect(() => {
trRef.current.nodes([rectRef.current]);
}, []);
return (
<Stage width={window.innerWidth} height={window.innerHeight}>
<Layer>
<Rect
x={rectPosition.x}
y={rectPosition.y}
width={160}
height={90}
fill="#7dd3fc"
stroke="black"
draggable
ref={rectRef}
onDragEnd={(e) => setRectPosition(e.target.position())}
onTransformEnd={(e) => setRectPosition(e.target.position())}
/>
<Transformer ref={trRef} rotateMode="corners" />
</Layer>
</Stage>
);
};
export default App;
<template>
<v-stage :config="stageSize">
<v-layer>
<v-rect :config="rectConfig" ref="rectRef" />
<v-transformer :config="transformerConfig" ref="transformerRef" />
</v-layer>
</v-stage>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const stageSize = {
width: window.innerWidth,
height: window.innerHeight,
};
const rectConfig = {
x: 80,
y: 80,
width: 160,
height: 90,
fill: '#7dd3fc',
stroke: 'black',
draggable: true,
};
const transformerConfig = {
rotateMode: 'corners',
};
const rectRef = ref(null);
const transformerRef = ref(null);
onMounted(() => {
transformerRef.value.getNode().nodes([rectRef.value.getNode()]);
});
</script>
另请参阅旋转吸附,了解如何在指定角度附近吸附旋转。