Cat*_*lin 6 javascript jquery html5-canvas fabricjs
object:over只有当鼠标位于形状本身而不是包含它的假想方块上时,是否可以在Fabric.js中捕获?
我有一个jsFiddle演示,它包含一个U形.你可以看到即使我把指针放在U里面而没有碰到任何一条线,它仍然会将它检测为一个object:over事件.

使用Javascript:
var canvas = new fabric.Canvas("c1", {
isDrawingMode: false
});
canvas.loadFromJSON(objectsJson, function () {
canvas.renderAll();
});
canvas.on("object:over", function () {
console.log("object over");
});
canvas.on("object:out", function () {
console.log("object out");
});
// code to capture mouse over object while isDrawingMode = false
canvas.findTarget = (function (originalFn) {
return function () {
var target = originalFn.apply(this, arguments);
if (target) {
if (this._hoveredTarget !== target) {
canvas.fire('object:over', { target: target });
if (this._hoveredTarget) {
canvas.fire('object:out', { target: this._hoveredTarget });
}
this._hoveredTarget = target;
}
}
else if (this._hoveredTarget) {
canvas.fire('object:out', { target: this._hoveredTarget });
this._hoveredTarget = null;
}
return target;
};
})(canvas.findTarget);
Run Code Online (Sandbox Code Playgroud)
对于fabric.js,每个形状,都会创建虚拟框,当与该虚拟框相交时,会触发绑定事件。
fabric.js,在下面的函数
上创建任何形状期间,通过创建各种点来创建虚拟框,例如:左上、右上、左下、右下、左中、右中、中下和中上。
setCoords: function() {
var strokeWidth = this.strokeWidth > 1 ? this.strokeWidth : 0,
padding = this.padding,
theta = degreesToRadians(this.angle);
this.currentWidth = (this.width + strokeWidth) * this.scaleX + padding * 2;
this.currentHeight = (this.height + strokeWidth) * this.scaleY + padding * 2;
// If width is negative, make postive. Fixes path selection issue
if (this.currentWidth < 0) {
this.currentWidth = Math.abs(this.currentWidth);
}
var _hypotenuse = Math.sqrt(
Math.pow(this.currentWidth / 2, 2) +
Math.pow(this.currentHeight / 2, 2));
var _angle = Math.atan(isFinite(this.currentHeight / this.currentWidth) ? this.currentHeight / this.currentWidth : 0);
// offset added for rotate and scale actions
var offsetX = Math.cos(_angle + theta) * _hypotenuse,
offsetY = Math.sin(_angle + theta) * _hypotenuse,
sinTh = Math.sin(theta),
cosTh = Math.cos(theta);
var coords = this.getCenterPoint();
var tl = {
x: coords.x - offsetX,
y: coords.y - offsetY
};
var tr = {
x: tl.x + (this.currentWidth * cosTh),
y: tl.y + (this.currentWidth * sinTh)
};
var br = {
x: tr.x - (this.currentHeight * sinTh),
y: tr.y + (this.currentHeight * cosTh)
};
var bl = {
x: tl.x - (this.currentHeight * sinTh),
y: tl.y + (this.currentHeight * cosTh)
};
var ml = {
x: tl.x - (this.currentHeight/2 * sinTh),
y: tl.y + (this.currentHeight/2 * cosTh)
};
var mt = {
x: tl.x + (this.currentWidth/2 * cosTh),
y: tl.y + (this.currentWidth/2 * sinTh)
};
var mr = {
x: tr.x - (this.currentHeight/2 * sinTh),
y: tr.y + (this.currentHeight/2 * cosTh)
};
var mb = {
x: bl.x + (this.currentWidth/2 * cosTh),
y: bl.y + (this.currentWidth/2 * sinTh)
};
var mtr = {
x: mt.x,
y: mt.y
};
this.oCoords = {
// corners
tl: tl, tr: tr, br: br, bl: bl,
// middle
ml: ml, mt: mt, mr: mr, mb: mb,
// rotating point
mtr: mtr
};
// set coordinates of the draggable boxes in the corners used to scale/rotate the image
this._setCornerCoords && this._setCornerCoords();
return this;
}
Run Code Online (Sandbox Code Playgroud)
因此,每当您用鼠标与这 8 个点中的任何一个相交时,都会触发附加事件。
据我所知fabric.js,它没有提供您想要的功能。
更新:-
正如 RaraituL 所说,可以通过 进行像素检测 perPixelTargetFind(),您可以在此处获取示例。http://fabricjs.com/per-pixel-drag-drop/
| 归档时间: |
|
| 查看次数: |
5423 次 |
| 最近记录: |