如何在fabricjs中限制矩形大小调整/移动到图像外部
how to restrict rectangle resizing/moving outside a image in fabricjs?
我正在使用fabricjs,并试图限制图像外矩形的移动/调整大小。
这是我迄今为止的小提琴:小提琴
代码:
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对象获得相同的效果),而不是事件图像,也不是可选图像。然后放在画布的后面。
加载图像时保存其边界坐标。
在对象移动时,计算对象bouding框,并检查它是否不会触摸图像框。如果触摸到它,则使用最新的已知良好值恢复图像的顶部和左侧值。
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>
相关文章:
- 为移动设备调整页面大小时,引导模式会向下移动页面
- 在调整大小和加载时移动 DOM 元素.仅适用于调整大小
- 调整父元素大小时,文本会移动
- 调整大小时移动在高图表上呈现的图像
- Css-是否可以在调整屏幕大小时使元素移动,以使其适合屏幕
- 将特定html文件上的幻灯片图像调整为移动屏幕
- 调整大小时移动元素
- jquery调整大小为移动窗口iPhone / Android
- j查询调整大小时移动元素
- Jquery 移动页脚不会调整为屏幕大小
- 自动检测移动设备或分辨率并相应地调整CSS
- 根据页面大小移动链接并调整链接大小
- 高图表:如果绘图线沿 xAxis 移动,则调整绘图带的大小
- 在移动设备上的引导程序 3 自动调整大小(高度)中禁用轮播
- 添加当窗口从移动设备更改为桌面时调整大小事件
- 移动导航在调整大小时未正确定位
- jQuery - 移动元素,其子元素由窗口大小调整触发
- 检测从纵向切换到横向时在移动设备上调整浏览器窗口大小,反之亦然
- 想要使用 html5 的画布优化捕获的图像调整大小和旋转的代码,现在在移动设备上发出内存不足警告
- 如何在fabricjs中限制矩形大小调整/移动到图像外部