如何在 fabricjs 中限制图像外的矩形 resizing/moving?
how to restrict rectangle resizing/moving outside a image in fabricjs?
我正在使用 fabricjs 并试图限制 moving/resizing 个图像外的矩形。
这是我目前所拥有的fiddle:Fiddle
代码:
var canvas = new fabric.Canvas('c');
canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 }));
canvas.setBackgroundImage('http://www.beatnyama.com/wp-content/uploads/2015/05/assets.jpg', canvas.renderAll.bind(canvas));
this.__canvases.push(canvas);
canvas.observe("object:moving", function(e){
var obj = e.target;
//code goes here to restrict moving/resizing outside image
});
我该如何实施?
在此处查看更新的 fiddle 或 运行 代码段。
http://jsfiddle.net/h2zvj3un/2/
基本上你不应该使用背景,因为你需要知道图像尺寸。
使用普通图像更容易(在可读性方面,您可以获得与 backgroundImage 对象相同的效果),而不是事件,不可选择。并设置到 canvas.
的后面
在图像加载时保存其边界坐标。
在物体移动时计算物体边界框并检查它是否会触及图像框。
如果它触及它,则使用最新的已知正确值恢复图像的顶部和左侧值。
var canvas = new fabric.Canvas('canvas');
var minX, minY, maxX, maxY;
canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 }));
fabric.Image.fromURL('http://www.beatnyama.com/wp-content/uploads/2015/05/assets.jpg', function(img){
img.evented=false;
img.selectable=false;
canvas.add(img);
minX = img.oCoords.tl.x;
maxX = img.oCoords.br.x;
minY = img.oCoords.tl.y;
maxY = img.oCoords.br.y;
canvas.sendToBack(img);
});
function checkmove(e) {
var obj = e.target;
obj.setCoords();
var b = obj.getBoundingRect();
if (!(b.left >= minX && maxX >= b.left + b.width)) {
obj.left = obj.lastLeft;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastLeft = obj.left;
obj.lastScaleX = obj.scaleX
}
if (!(maxY >= b.top + b.height && b.top >= minY)) {
obj.top = obj.lastTop;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastTop = obj.top;
obj.lastScaleY = obj.scaleY
}
}
function checkscale(e) {
var obj = e.target;
obj.setCoords();
var b = obj.getBoundingRect();
if (!(b.left >= minX && maxX >= b.left + b.width && maxY >= b.top + b.height && b.top >= minY)) {
obj.left = obj.lastLeft;
obj.top = obj.lastTop;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastLeft = obj.left;
obj.lastTop = obj.top;
obj.lastScaleX = obj.scaleX
obj.lastScaleY = obj.scaleY
}
}
canvas.observe("object:moving", checkmove);
canvas.observe("object:scaling", checkscale);
<script src="http://fabricjs.com/lib/fabric.js"></script>
<canvas id='canvas' width="550" height="550" style="border:#000 1px solid;"></canvas>
我正在使用 fabricjs 并试图限制 moving/resizing 个图像外的矩形。
这是我目前所拥有的fiddle:Fiddle
代码:
var canvas = new fabric.Canvas('c');
canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 }));
canvas.setBackgroundImage('http://www.beatnyama.com/wp-content/uploads/2015/05/assets.jpg', canvas.renderAll.bind(canvas));
this.__canvases.push(canvas);
canvas.observe("object:moving", function(e){
var obj = e.target;
//code goes here to restrict moving/resizing outside image
});
我该如何实施?
在此处查看更新的 fiddle 或 运行 代码段。 http://jsfiddle.net/h2zvj3un/2/
基本上你不应该使用背景,因为你需要知道图像尺寸。 使用普通图像更容易(在可读性方面,您可以获得与 backgroundImage 对象相同的效果),而不是事件,不可选择。并设置到 canvas.
的后面在图像加载时保存其边界坐标。
在物体移动时计算物体边界框并检查它是否会触及图像框。 如果它触及它,则使用最新的已知正确值恢复图像的顶部和左侧值。
var canvas = new fabric.Canvas('canvas');
var minX, minY, maxX, maxY;
canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 }));
fabric.Image.fromURL('http://www.beatnyama.com/wp-content/uploads/2015/05/assets.jpg', function(img){
img.evented=false;
img.selectable=false;
canvas.add(img);
minX = img.oCoords.tl.x;
maxX = img.oCoords.br.x;
minY = img.oCoords.tl.y;
maxY = img.oCoords.br.y;
canvas.sendToBack(img);
});
function checkmove(e) {
var obj = e.target;
obj.setCoords();
var b = obj.getBoundingRect();
if (!(b.left >= minX && maxX >= b.left + b.width)) {
obj.left = obj.lastLeft;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastLeft = obj.left;
obj.lastScaleX = obj.scaleX
}
if (!(maxY >= b.top + b.height && b.top >= minY)) {
obj.top = obj.lastTop;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastTop = obj.top;
obj.lastScaleY = obj.scaleY
}
}
function checkscale(e) {
var obj = e.target;
obj.setCoords();
var b = obj.getBoundingRect();
if (!(b.left >= minX && maxX >= b.left + b.width && maxY >= b.top + b.height && b.top >= minY)) {
obj.left = obj.lastLeft;
obj.top = obj.lastTop;
obj.scaleX= obj.lastScaleX
obj.scaleY= obj.lastScaleY
} else {
obj.lastLeft = obj.left;
obj.lastTop = obj.top;
obj.lastScaleX = obj.scaleX
obj.lastScaleY = obj.scaleY
}
}
canvas.observe("object:moving", checkmove);
canvas.observe("object:scaling", checkscale);
<script src="http://fabricjs.com/lib/fabric.js"></script>
<canvas id='canvas' width="550" height="550" style="border:#000 1px solid;"></canvas>