Fabric JS 在动画对象上使用 mouse:over
Fabric JS using mouse:over on an animating object
我可以为对象设置动画,然后添加 mouse:over
事件。
var canvas = new fabric.Canvas('c');
var x1 = 5;
var y1 = 5;
var x2 = 100;
var y2 = 100;
var rect = new fabric.Rect({
width: 10,
height: 10,
left: x1,
top: y1,
stroke: '#000',
strokeWidth: 2,
fill: '#faa',
selectable: false
});
canvas.add(rect);
rect.animate({
'left': x2,
'top': y2
}, {
duration: 10000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
}
});
canvas.on('mouse:over', function (e) {
console.log('mouseover');
});
<canvas id="c"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
但是 mouse:over
事件继续从矩形的原始位置触发。动画完成后,mouse:over
事件将再次作用于动画对象。
是否可以在对象 moving/animating 时触发 mouse:over
事件?
我想不出内置的方法。您可能希望将此作为问题提交。与此同时,我想我有一个可用的解决方法:
// Setup
var canvas = new fabric.Canvas('c');
var x1 = 5;
var y1 = 5;
var x2 = 100;
var y2 = 100;
var rectWidth = 10;
var rectHeight = 10;
var rect = new fabric.Rect({
width: rectWidth,
height: rectHeight,
left: x1,
top: y1,
stroke: '#000',
strokeWidth: 2,
fill: '#faa',
selectable: false
});
canvas.add(rect);
rect.animate({
'left': x2,
'top': y2
}, {
duration: 10000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
}
});
//
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect(), // abs. size of element
scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X
scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y
return {
x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have
y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element
}
}
// The important stuff
canvas.on('mouse:move', function (o) {
var pos = getMousePos(canvas.getElement(), o.e);
// Do math to figure out if the mouse move was inside the the object. For a Rect:
if (
pos.x >= rect.left &&
pos.x <= rect.left + rectWidth &&
pos.y >= rect.top &&
pos.y <= rect.top + rectHeight
) {
console.log('mouseover');
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
<canvas id="c"></canvas>
本质上,我在听mouse:move
。每次鼠标移动时,我都会获取光标坐标并检查它是否在形状内。
现在,它被硬编码为只能在 Rect
s 上工作,但也许你可以引入像 isInside(object, pos)
这样的函数,其中 returns a boolean
,并且在那里你可以检查 object
是什么类型并据此做出决定。
我知道这个话题很老了,但我刚刚 运行 遇到了同样的问题。
经过一番摆弄后,发现在对象移动后调用 setCoords()
将更新内部状态,以便 mouseover
再次正常工作。
我可以为对象设置动画,然后添加 mouse:over
事件。
var canvas = new fabric.Canvas('c');
var x1 = 5;
var y1 = 5;
var x2 = 100;
var y2 = 100;
var rect = new fabric.Rect({
width: 10,
height: 10,
left: x1,
top: y1,
stroke: '#000',
strokeWidth: 2,
fill: '#faa',
selectable: false
});
canvas.add(rect);
rect.animate({
'left': x2,
'top': y2
}, {
duration: 10000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
}
});
canvas.on('mouse:over', function (e) {
console.log('mouseover');
});
<canvas id="c"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
但是 mouse:over
事件继续从矩形的原始位置触发。动画完成后,mouse:over
事件将再次作用于动画对象。
是否可以在对象 moving/animating 时触发 mouse:over
事件?
我想不出内置的方法。您可能希望将此作为问题提交。与此同时,我想我有一个可用的解决方法:
// Setup
var canvas = new fabric.Canvas('c');
var x1 = 5;
var y1 = 5;
var x2 = 100;
var y2 = 100;
var rectWidth = 10;
var rectHeight = 10;
var rect = new fabric.Rect({
width: rectWidth,
height: rectHeight,
left: x1,
top: y1,
stroke: '#000',
strokeWidth: 2,
fill: '#faa',
selectable: false
});
canvas.add(rect);
rect.animate({
'left': x2,
'top': y2
}, {
duration: 10000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
}
});
//
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect(), // abs. size of element
scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X
scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y
return {
x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have
y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element
}
}
// The important stuff
canvas.on('mouse:move', function (o) {
var pos = getMousePos(canvas.getElement(), o.e);
// Do math to figure out if the mouse move was inside the the object. For a Rect:
if (
pos.x >= rect.left &&
pos.x <= rect.left + rectWidth &&
pos.y >= rect.top &&
pos.y <= rect.top + rectHeight
) {
console.log('mouseover');
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
<canvas id="c"></canvas>
本质上,我在听mouse:move
。每次鼠标移动时,我都会获取光标坐标并检查它是否在形状内。
现在,它被硬编码为只能在 Rect
s 上工作,但也许你可以引入像 isInside(object, pos)
这样的函数,其中 returns a boolean
,并且在那里你可以检查 object
是什么类型并据此做出决定。
我知道这个话题很老了,但我刚刚 运行 遇到了同样的问题。
经过一番摆弄后,发现在对象移动后调用 setCoords()
将更新内部状态,以便 mouseover
再次正常工作。