You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Konva.js通过线条绘制多边形并实现变换功能?

用Konva.js实现自定义多边形绘制与变换功能

要实现用户绘制自定义多边形并支持旋转、缩放等变换,我们可以基于Konva.js的事件监听、图形绘制和Transformer工具来完成,具体步骤如下:

1. 初始化Konva舞台与基础层

先创建舞台和两个分层:一个用于承载绘制过程中的临时线条与顶点标记,另一个用于存放最终完成的多边形,避免绘制过程的临时元素干扰成品图形。

<div id="container"></div>

<script src="https://unpkg.com/konva@9.2.0/konva.min.js"></script>
<script>
  // 创建舞台实例
  const stage = new Konva.Stage({
    container: 'container',
    width: window.innerWidth,
    height: window.innerHeight
  });

  // 临时绘制层(存放引导线、顶点标记)
  const drawLayer = new Konva.Layer();
  // 成品多边形图层
  const shapeLayer = new Konva.Layer();

  stage.add(drawLayer);
  stage.add(shapeLayer);
</script>

2. 实现多边形绘制逻辑

通过监听鼠标事件记录顶点坐标,实时预览绘制路径,支持双击或回车完成绘制:

  • 鼠标按下:记录第一个顶点,添加顶点标记,开启绘制状态
  • 鼠标移动:更新临时引导线,连接最后一个顶点与当前鼠标位置
  • 鼠标松开:固定当前顶点
  • 双击/回车:完成多边形绘制(需至少3个顶点)
let isDrawing = false;
let points = [];
// 临时引导线
const tempLine = new Konva.Line({
  stroke: '#1abc9c',
  strokeWidth: 2,
  dash: [5, 5]
});
drawLayer.add(tempLine);

// 鼠标按下触发顶点记录
stage.on('mousedown', (e) => {
  if (e.target === stage) {
    isDrawing = true;
    const pos = stage.getPointerPosition();
    points.push(pos.x, pos.y);

    // 添加红色顶点标记
    const dot = new Konva.Circle({
      x: pos.x,
      y: pos.y,
      radius: 4,
      fill: '#e74c3c'
    });
    drawLayer.add(dot);
    drawLayer.draw();
  }
});

// 鼠标移动更新引导线
stage.on('mousemove', () => {
  if (!isDrawing) return;
  const pos = stage.getPointerPosition();
  tempLine.points([...points, pos.x, pos.y]);
  drawLayer.draw();
});

// 鼠标松开固定顶点
stage.on('mouseup', () => {
  if (!isDrawing) return;
  tempLine.points(points);
  drawLayer.draw();
});

// 双击完成绘制
stage.on('dblclick', () => {
  if (points.length < 6) return; // 至少3个顶点(每个顶点含x、y两个值)
  finishPolygon();
});

// 回车完成绘制
document.addEventListener('keydown', (e) => {
  if (e.key === 'Enter' && points.length >= 6) {
    finishPolygon();
  }
});

3. 完成多边形绘制并添加变换功能

当顶点数量达标后,创建正式多边形,清空临时绘制元素,并通过Konva.Transformer为多边形添加旋转、缩放、拖拽能力:

function finishPolygon() {
  isDrawing = false;

  // 创建成品多边形
  const polygon = new Konva.Polygon({
    points: points,
    fill: 'rgba(34, 167, 240, 0.5)',
    stroke: '#22a7f0',
    strokeWidth: 2,
    draggable: true // 开启拖拽
  });
  shapeLayer.add(polygon);

  // 添加Transformer组件,支持旋转、缩放
  const transformer = new Konva.Transformer({
    node: polygon,
    rotateEnabled: true,
    scaleEnabled: true,
    borderColor: '#22a7f0'
  });
  shapeLayer.add(transformer);

  // 清空临时绘制内容
  points = [];
  tempLine.points([]);
  drawLayer.destroyChildren();
  drawLayer.draw();
  shapeLayer.draw();
}

效果预览

自定义多边形绘制与变换效果

内容的提问来源于stack exchange,提问作者f-accu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:21:10