Skip to main content

如何在不改变形状描边大小的情况下调整画布上的形状大小?

请记住,Konva.Transformer 会更改节点的 scaleX 和 scaleY 属性。
默认情况下,如果你正在变换一个形状,它的描边也会随之缩放。在某些情况下,这并不是理想的行为。

有两种方法可以防止描边缩放:

  1. 重置形状的缩放比例
  2. 使用 shape.strokeScaleEnabled(false) 和 transformer.ignoreStroke(true)

说明:有两个矩形可以调整大小。绿色矩形会重置其缩放比例。红色矩形只会禁用描边缩放。

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);

// first way - reset scale on transform end
const rect1 = new Konva.Rect({
x: 50,
y: 50,
width: 100,
height: 100,
fill: '#00ff00',
stroke: 'black',
strokeWidth: 5,
draggable: true,
});
layer.add(rect1);

const tr1 = new Konva.Transformer({
nodes: [rect1],
});
layer.add(tr1);

rect1.on('transformend', () => {
const scaleX = rect1.scaleX();
const scaleY = rect1.scaleY();
// apply the scale to the size, then reset it
rect1.scaleX(1);
rect1.scaleY(1);
rect1.width(Math.max(5, rect1.width() * scaleX));
rect1.height(Math.max(5, rect1.height() * scaleY));
});

// second way - disable stroke scaling
const rect2 = new Konva.Rect({
x: 200,
y: 50,
width: 100,
height: 100,
fill: '#ff0000',
stroke: 'black',
strokeWidth: 5,
draggable: true,
strokeScaleEnabled: false,
});
layer.add(rect2);

const tr2 = new Konva.Transformer({
nodes: [rect2],
ignoreStroke: true,
});
layer.add(tr2);