我在容器内部有一个位图。当我拖动容器时,光标变为编辑文本形状,并且图像也会跳转到光标的右下角(就像我从左上角抓住图像并拖动它一样)
这是我的代码,所以你可以看到我的RTFM:
function createIcon(imgPath) {
var image = new Image();
image.onload = function () {
var img = new createjs.Bitmap(event.target)
var con = new createjs.Container();
con.x = 160;
con.y = 100;
con.addChild(img);
stage.addChild(con);
con.on("pressmove", function(evt) {
evt.currentTarget.x = evt.stageX;
evt.currentTarget.y = evt.stageY;
stage.update();
});
stage.update();
}
image.src = imgPath;
}
任何想法有什么不对?
答案 0 :(得分:5)
为了防止跳跃,你必须在按下之前添加一个额外的步骤:
con.on('mousedown', function(evt) {
var ct = evt.currentTarget,
local = ct.globalToLocal(evt.stageX, evt.stageY),
nx = ct.regX - local.x,
ny = ct.regY - local.y;
//set the new regX/Y
ct.regX = local.x;
ct.regY = local.y;
//adjust the real-position, otherwise the new regX/Y would cause a jump
ct.x -= nx;
ct.y -= ny;
});
这会将新的regX / Y设置为当前的鼠标位置,以防止形状/图像跳跃。
对于光标: 你可以通过CSS设置它:
canvas {
cursor: default !important; /* in this case you couldn't set any other cursor via EaselJS though */
}
或者你可以通过EaselJS设置:http://www.createjs.com/Docs/EaselJS/classes/DisplayObject.html#property_cursor
con.cursor = "default"; //or 'pointer'...or whatever cursor you want it to be
// you have to activate enableMouseOver though on the stage for this to work
答案 1 :(得分:3)
尽管@olsn提供的解决方案肯定有效,但使用regX / regY来偏移对象以考虑当前鼠标位置可能会在随后转换对象时导致困难。
E.g。如果要围绕其中心旋转对象,则需要将regX / regY重置为对象宽度/ 2和对象高度/ 2。这将重新引入故障,尽管在对象操作的后期阶段。
鉴于这样的情况,我喜欢阻止使用regX / regY来防止拖拽故障。
或者,我会记下dragstart
上的鼠标位置,并在dragging
时测量鼠标移动。通过将此移动应用于对象x / y位置,对象将显示为使用鼠标移动,模拟拖动。
如this fiddle和以下代码所示:
function enableDrag(obj) {
obj.on("mousedown", dragstart);
obj.on("pressmove", drag);
};
function dragstart(evt) {
dragging = false;
}
function drag(evt) {
// register object starting point and mousedrag (stage) starting point
if (!dragging || !dragging.startCoords || !dragging.stageCoords) {
dragging = evt.currentTarget;
dragging.startCoords = {x: dragging.x, y: dragging.y};
dragging.stageCoords = {x: evt.stageX, y: evt.stageY};
}
// calculate mouse offset after move, relative to starting point, subtract this movement from object coords (move)
dragging.stageMove = {x: dragging.stageCoords.x - evt.stageX, y: dragging.stageCoords.y - evt.stageY};
dragging.objectMove = {x: dragging.startCoords.x - dragging.stageMove.x, y: dragging.startCoords.y - dragging.stageMove.y};
// apply movement to object
evt.currentTarget.x = dragging.objectMove.x;
evt.currentTarget.y = dragging.objectMove.y;
stage.update(); //update stage without passing through ticker for higher FPS
}
答案 2 :(得分:1)
我的解决方案
(function(t, n) {
layer.addEventListener('mousedown', function(evt) {
var offset = {
x: t.x - evt.stageX,
y: t.y - evt.stageY
}
t.addEventListener("pressmove", function(e2){
t.x = offset.x + e2.stageX;
t.y = offset.y + e2.stageY;
app.stage.update();
})
});
})(layer, i);
其中图层是图层, 而我没有被使用。