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