跳到主要内容

HTML5 Canvas 放置事件

Konva 不支持放置事件,但你可以自行编写放置事件检测逻辑。 如需检测作为放置目标的图形,必须把正在拖动的对象移到另一个图层。

此示例展示 dropdragenterdragleavedragover 事件的实现。

操作说明: 将一个图形拖到另一个图形上方。也可以将一个图形拖放到另一个图形中。

import Konva from 'konva';

const stage = new Konva.Stage({
container: 'container',
width: window.innerWidth,
height: window.innerHeight,
});

const layer = new Konva.Layer();
const tempLayer = new Konva.Layer();
stage.add(layer);
stage.add(tempLayer);

const text = new Konva.Text({
fill: 'black',
});
layer.add(text);

let previousShape;

// create multiple stars
for (let i = 0; i < 10; i++) {
const star = new Konva.Star({
x: stage.width() * Math.random(),
y: stage.height() * Math.random(),
fill: 'blue',
numPoints: 10,
innerRadius: 20,
outerRadius: 25,
draggable: true,
name: 'star ' + i,
shadowOffsetX: 5,
shadowOffsetY: 5,
});

star.on('dragstart', () => {
star.moveTo(tempLayer);
text.text('Moving ' + star.name());
});

star.on('dragmove', (e) => {
const pos = stage.getPointerPosition();
const shape = layer.getIntersection(pos);

if (previousShape && shape) {
if (previousShape !== shape) {
// leave from old target
previousShape.fire('dragleave', { evt: e.evt }, true);
// enter new target
shape.fire('dragenter', { evt: e.evt }, true);
previousShape = shape;
} else {
previousShape.fire('dragover', { evt: e.evt }, true);
}
} else if (!previousShape && shape) {
previousShape = shape;
shape.fire('dragenter', { evt: e.evt }, true);
} else if (previousShape && !shape) {
previousShape.fire('dragleave', { evt: e.evt }, true);
previousShape = undefined;
}
});

star.on('dragend', (e) => {
const pos = stage.getPointerPosition();
const shape = layer.getIntersection(pos);
if (previousShape && previousShape !== shape) {
previousShape.fire('dragleave', { evt: e.evt }, true);
}
if (shape) {
shape.fire('drop', { evt: e.evt }, true);
}
previousShape = undefined;
star.moveTo(layer);
});

star.on('dragenter', () => {
star.fill('green');
text.text('dragenter ' + star.name());
});

star.on('dragleave', () => {
star.fill('blue');
text.text('dragleave ' + star.name());
});

star.on('dragover', () => {
text.text('dragover ' + star.name());
});

star.on('drop', () => {
star.fill('red');
text.text('drop ' + star.name());
});

layer.add(star);
}