使用Konva.js中的相同锚点调整和旋转线条

问题描述 投票:1回答:1

我正在使用Konva.js在浏览器中注释数据可视化。常见的用例是在形状(矩形,椭圆形)和描述(文本节点)之间绘制线条。用户需要拖动,旋转和调整线条。调整大小仅限于线宽。

线路及其变压器目前正在增加如下:

var line = new Konva.Line({
    x: stage.getWidth() / 2,
    y: stage.getHeight() / 2,
    points: [0, 0, 100, 0],
    stroke: '#000',
    strokeWidth: 3,
    lineCap: 'round',
    lineJoin: 'round',
    draggable: true,
    id: id,
    strokeScaleEnabled: false,
    hitStrokeWidth: 15
});

layer.add(line);

var tr = new Konva.Transformer({
    node: line,
    enabledAnchors: ['middle-left', 'middle-right']
});

layer.add(tr);

正确定位线条目前不是很直观,因为它需要用户使用旋转,中左和中右锚点单独旋转和调整线条的大小。

相反,我正在寻找一种方法来使用中左和中右锚来同时旋转和调整线的大小。我的灵感来自PowerPoint - 线条两端只有锚点,可用于同时调整大小和旋转:

Lines in PowerPoint

我尝试在Konva的Transformer _handleMouseMove函数中组合旋转器和中左/中右功能,但这不能按预期工作。

有没有人可能找到一种方法来使用左右锚点同时做两件事?

konvajs
1个回答
2
投票

目前,我不建议使用Konva.Transformer作为简单的一行。使用几个圆圈构建自定义解决方案非常简单:

const line = new Konva.Line({
  points: [50, 50, 250, 50],
  stroke: 'green'
});
layer.add(line);

const anchor1 = new Konva.Circle({
  x: line.points()[0],
  y: line.points()[1],
  radius: 10,
  fill: 'red',
  draggable: true
})
layer.add(anchor1);

const anchor2 = new Konva.Circle({
  x: line.points()[2],
  y: line.points()[3],
  radius: 10,
  fill: 'red',
  draggable: true
})
layer.add(anchor2);


function updateLine() {
  const points = [
    anchor1.x(),
    anchor1.y(),
    anchor2.x(),
    anchor2.y(),
  ]
  line.points(points);
  layer.batchDraw();
}

anchor1.on('dragmove', updateLine);
anchor2.on('dragmove', updateLine);

但是:ぁzxswい

© www.soinside.com 2019 - 2024. All rights reserved.