在Konva.js中调整具有相同锚点的线并调整其大小

时间:2019-04-16 08:03:13

标签: konvajs

我正在使用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函数中结合使用旋转器和左中/右中功能,但这无法正常工作。

也许有人找到一种使用左右锚来同时做两件事的方法吗?

1 个答案:

答案 0 :(得分: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);

演示:https://jsbin.com/wahetunepa/edit?html,js,output