以编程方式拖动对象
Drag object programmatically
我有 3 个矩形,如下所示:
new Fabric.Rect({
width: 200 - index * 30,
height: 20,
hasBorders: false,
selectable: false,
hasControls: false
});
然后我有一个点击事件,它检测点击靠近(不在矩形上)矩形并使顶部矩形(3 个堆栈中最高的一个)可选择(拖动它):
var first = this.first().shape; // Fabric.Rect
canvas.setActiveObject(first);
但是,这并没有设置光标上的对象,要拖动对象。
我怎样才能让对象被选中,立即移动到光标,并在点击事件触发后被拖动?
如果我理解正确的话,这应该让你相当接近。
单击 canvas 黑色方块内部和红色对象外部的任意位置。
var canvas = new fabric.Canvas('c', {
selection: false,
});
var rectangle = new fabric.Rect({
fill: 'red',
left: 10,
top: 10,
width: 100,
height: 100 //,
//padding: 50
});
canvas.on('mouse:down', function(env) {
var x = env.e.offsetX;
var y = env.e.offsetY;
rectangle.setLeft(x - rectangle.width / 2);
rectangle.setTop(y - rectangle.height / 2);
canvas.setActiveObject(rectangle);
rectangle.setCoords();
canvas.renderAll();
canvas.on('mouse:move', function(env) {
var x = env.e.offsetX;
var y = env.e.offsetY;
rectangle.setLeft(x - rectangle.width / 2);
rectangle.setTop(y - rectangle.height / 2);
rectangle.setCoords();
canvas.renderAll();
});
canvas.on('mouse:up', function(env) {
canvas.off('mouse:move');
});
});
canvas.add(rectangle);
canvas.renderAll();
#c {
border: 1px solid black;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
<canvas id="c" width="200" height="200"></canvas>
我故意在矩形上注释掉 padding
,但将其留在代码中,以防您想将其用作您的 NEAR 逻辑而不是您已有的逻辑。如果您确实选择使用 padding
作为您的 NEAR 逻辑,那么您需要将 on canvas mouse:down
事件更改为 on canvas object:selected
事件。
此外,如果您还没有这样做,您可能想仔细看看这个对象边界矩形示例,以进一步了解您的 NEAR 逻辑,http://fabricjs.com/bounding-rectangle。
任何人,告诉我你过得怎么样,伙计!
我有 3 个矩形,如下所示:
new Fabric.Rect({
width: 200 - index * 30,
height: 20,
hasBorders: false,
selectable: false,
hasControls: false
});
然后我有一个点击事件,它检测点击靠近(不在矩形上)矩形并使顶部矩形(3 个堆栈中最高的一个)可选择(拖动它):
var first = this.first().shape; // Fabric.Rect
canvas.setActiveObject(first);
但是,这并没有设置光标上的对象,要拖动对象。
我怎样才能让对象被选中,立即移动到光标,并在点击事件触发后被拖动?
如果我理解正确的话,这应该让你相当接近。
单击 canvas 黑色方块内部和红色对象外部的任意位置。
var canvas = new fabric.Canvas('c', {
selection: false,
});
var rectangle = new fabric.Rect({
fill: 'red',
left: 10,
top: 10,
width: 100,
height: 100 //,
//padding: 50
});
canvas.on('mouse:down', function(env) {
var x = env.e.offsetX;
var y = env.e.offsetY;
rectangle.setLeft(x - rectangle.width / 2);
rectangle.setTop(y - rectangle.height / 2);
canvas.setActiveObject(rectangle);
rectangle.setCoords();
canvas.renderAll();
canvas.on('mouse:move', function(env) {
var x = env.e.offsetX;
var y = env.e.offsetY;
rectangle.setLeft(x - rectangle.width / 2);
rectangle.setTop(y - rectangle.height / 2);
rectangle.setCoords();
canvas.renderAll();
});
canvas.on('mouse:up', function(env) {
canvas.off('mouse:move');
});
});
canvas.add(rectangle);
canvas.renderAll();
#c {
border: 1px solid black;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
<canvas id="c" width="200" height="200"></canvas>
我故意在矩形上注释掉 padding
,但将其留在代码中,以防您想将其用作您的 NEAR 逻辑而不是您已有的逻辑。如果您确实选择使用 padding
作为您的 NEAR 逻辑,那么您需要将 on canvas mouse:down
事件更改为 on canvas object:selected
事件。
此外,如果您还没有这样做,您可能想仔细看看这个对象边界矩形示例,以进一步了解您的 NEAR 逻辑,http://fabricjs.com/bounding-rectangle。
任何人,告诉我你过得怎么样,伙计!