gpt4 book ai didi

javascript - 使用 mousemove 绘制形状,使用 kineticjs 拖放和调整大小- KineticJS

转载 作者:行者123 更新时间:2023-11-30 18:07:05 25 4
gpt4 key购买 nike

我正在使用 KineticJS 开发一个简单的绘画程序。我要实现的是用鼠标移动绘制一个矩形、直线或圆形,绘制的形状可以通过鼠标拖动或调整大小。我的问题是,我必须使用 mousedownmousemove 事件来绘制,但我无法同时实现拖放和调整大小。

这是我的绘图代码:

stage.on("mousedown", function() {
if ((drawFlag == 1) && (dragFlag == 0)) {
if (moving) {
moving = false;
layer.draw();
} else {
var mousePos = stage.getMousePosition();
line = new Kinetic.Line({
points: [0, 0, 50, 50],
stroke: "red"
});
layer.add(line);

line.getPoints()[0].x = mousePos.x;
line.getPoints()[0].y = mousePos.y;
line.getPoints()[1].x = mousePos.x;
line.getPoints()[1].y = mousePos.y;

moving = true;
layer.drawScene();
}
}

if ((drawFlag == 2) && (dragFlag == 0)) {
if (moving) {
moving = false;
layer.draw();
} else {
var mousePos = stage.getMousePosition();
rect = new Kinetic.Rect({
x: 20,
y: 20,
fill: "red",
stroke: "black",
strokeWidth: 2,
draggle: true,
width: 0,
height: 0
});

rect.setX(mousePos.x);
rect.setY(mousePos.y);
rect.setWidth(0);
rect.setHeight(0);

moving = true;
layer.drawScene();



layer.add(rect);

Rects.push(rect);
}
}
});

stage.on("mousemove", function() {
if ((drawFlag == 1) && (dragFlag == 0)) {
if (moving) {
var mousePos = stage.getMousePosition();
var x = mousePos.x;
var y = mousePos.y;
line.getPoints()[1].x = mousePos.x;
line.getPoints()[1].y = mousePos.y;
moving = true;
layer.drawScene();
}
}
if ((drawFlag == 2) && (dragFlag == 0)) {
if (moving) {
var mousePos = stage.getMousePosition();
var x = mousePos.x;
var y = mousePos.y;
rect.setWidth(mousePos.x - rect.getX());
rect.setHeight(mousePos.y - rect.getY());
moving = true;
layer.drawScene();
}
}
});

stage.on("mouseup", function() {
moving = false;
});

绘制矩形后,当我点击它时,它应该会随着鼠标移动而被拖动。但是,在我的程序中,单击绘制的矩形会导致绘制另一个矩形而不是拖动它。所以我尝试使用一个 dragFlag 来指示我是在绘制还是在拖动。我使用一个函数来检查鼠标光标是否在任何绘制的矩形上:

for (var n = 0; n < Rects.length; n++) {
(function() {
Rects[n].on('mouseover', function() {
dragFlag = 1;
document.body.style.cursor = "pointer";
});

Rects[n].on('mouseout', function() {
dragFlag = 0;
document.body.style.cursor = "default";
});
if (dragFlag == 1) {
Rects[n].on("dragstart", function() {
Rects[n].moveToTop();
layer.draw();
});

Rects[n].on("dragmove", function() {
document.body.style.cursor = "pointer";
});
}

});

但这行不通。无法检查我的鼠标光标的位置,因此我在单击已绘制的矩形时仍在绘制一个新矩形。有谁知道如何通过鼠标移动来实现绘图,并在绘制的形状上拖放?

感谢您的帮助。

最佳答案

好吧,首先尝试使用一些简单的东西进行调试:

Rects[n].on('mouseover', function() {
dragFlag = 1;
alert('mouse over rectangle'); //check if event fired
document.body.style.cursor = "pointer";
});

真正的问题是你的逻辑越来越复杂和快速,你需要简化它并重构它。

想想Paint,你可以用选择工具,也可以用线工具,或者矩形工具,这不是由舞台上的事件决定的,而是由用户所处的模式决定的。

因此,您应该做的是创建按钮,并在每次单击按钮时为每个事件分离/重新附加函数。

例子

drawLineButton.on('click', function() {
stage.off(); // or whatever function to remove other events from stage
stage.on('mousedown', function() {
draw line logic
});
});

drawRectButton.on('click', function() {
stage.off(); // or whatever function to remove other events from stage
stage.on('mousedown', function() {
draw rectangle logic
});
});

dragButton.on('click', function() {
stage.off(); // or whatever function to remove other events from stage
// now you dont have to worry about stage events firing and can drag shapes
});

关于javascript - 使用 mousemove 绘制形状,使用 kineticjs 拖放和调整大小- KineticJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com