Skip to main content

拖放压力测试与10,000个形状

本示例展示了一个包含10,000个形状的压力测试。为简化操作,我们只使用了两个图层 - 一个主要图层用于所有形状,一个专用的拖动图层。当我们拖动一个形状时,它会移动到单独的拖动图层上,以确保移动的流畅性。

import Konva from 'konva';

const width = window.innerWidth;
const height = window.innerHeight;

// 创建舞台
const stage = new Konva.Stage({
  container: 'container',
  width: width,
  height: height,
});

// 创建用于所有形状的主要图层
const mainLayer = new Konva.Layer();

// 创建一个专用图层用于拖动
const dragLayer = new Konva.Layer();

// 定义随机形状的颜色
const colors = [
  'red',
  'orange',
  'yellow',
  'green',
  'blue',
  'cyan',
  'purple',
];
let colorIndex = 0;

// 辅助函数,将圆添加到图层
function addCircle(layer) {
  const color = colors[colorIndex++];
  if (colorIndex >= colors.length) {
    colorIndex = 0;
  }

  const randX = Math.random() * stage.width();
  const randY = Math.random() * stage.height();
  const circle = new Konva.Circle({
    x: randX,
    y: randY,
    radius: 6,
    fill: color,
  });

  layer.add(circle);
}

// 在主要图层上创建10,000个圆
for (let n = 0; n < 10000; n++) {
  addCircle(mainLayer);
}

// 将主要图层和拖动图层添加到舞台
stage.add(mainLayer);
stage.add(dragLayer);

// 设置拖放行为
stage.on('mousedown', function (evt) {
  const circle = evt.target;
  
  // 仅处理圆形(忽略在空白区域的点击)
  if (!circle || circle.getClassName() !== 'Circle') {
    return;
  }
  
  // 将圆形移动到拖动图层
  circle.moveTo(dragLayer);
  circle.startDrag();
});

// 当拖动停止时,将圆形移动回主要图层
stage.on('mouseup', function (evt) {
  const circle = evt.target;
  
  // 仅处理圆形
  if (!circle || circle.getClassName() !== 'Circle') {
    return;
  }
  
  // 将圆形移回主要图层
  circle.moveTo(mainLayer);
});