fabricjs 如何在其他缩放时保持组元素的固定大小?
fabricjs How can i keep fixed size on group elements while others scaling?
你好我用fabricjs来玩htmlcanvas。
我创建了 canvas 并在其上添加了一组对象。
在一组对象上,我需要在缩放对象时保持某些对象的固定宽度和高度。
我使用 'object:scaling' 事件 在活动对象改变大小时获取它,我读取组中的每个对象并分配 元素[i].set({'radius':5}) 在我想保持不变的组对象上。
但结果是,所有组都反对调整大小。
我向您展示 object:scaling 事件的片段 :
canvas.on('object:scaling',function(e){
var activeObject1 = e.target;
var elements = e.target._objects;
var count_elements = elements.length;
for(var i = 0; i < count_elements; i++) {
var type = elements[i].typeCircle;
if(type == "parts"){
//elements[i].set({"radius":8,"fill":"#abcde2","stroke":"#367827"});
//elements[i].set('radius',8);
/*elements[i].setWidth(16);
elements[i].setHeight(16);
elements[i].currentWidth = 16;
elements[i].currentHeight = 16;
elements[i].scaleX = 1;
elements[i].scaleY = 1;
console.log(elements[i]);
canvas.renderAll();*/
}
}
});
我应该在 for 循环中写入什么以保持某些对象的固定大小?
我在上面使用的所有内容,除了 "fill":"#abcde2","stroke":"#367827"
外,它们都不起作用
如果有人在 fabricjs 上遇到过类似的问题,请告诉我。
您必须使用 setScaleX() 和 setScaleY() 方法。
这是一个例子...
var Rect = new fabric.Rect({
width: 200,
height: 200,
top: 100,
left: 100,
fill: 'rgba(255,0,0,0.5)',
stroke: '#000',
strokeWidth: 1,
});
var Circle = new fabric.Circle({
left: 100,
top: 100,
fill: '#FF00FF',
stroke: 'red',
radius: 100,
opacity: 1,
});
var Group = new fabric.Group([Rect, Circle])
canvas.add(Group)
canvas.on({
'object:scaling': onChange
})
function onChange(obj) {
var circle = obj.target.item(1),
group = obj.target,
scaleX = circle.width / group.getWidth(),
scaleY = circle.height / group.getHeight();
circle.setScaleX(scaleX);
circle.setScaleY(scaleY);
}
使用 fabricjs2 停止缩放文本项我修改了 Rafik Avtoyan 的函数以使其运行良好。我已经为我的组锁定了 Y 缩放,所以如果需要你必须添加它。
function handleScalingEvent(obj) {
var text = obj.target.item(1),
group = obj.target,
scaleX = group.width / (group.width * group.scaleX);
text.set('scaleX', scaleX);
}
使对象大小相同的最佳方法是将所需宽度除以对象宽度。例如,如果您希望所有添加的对象都是 256px,代码将如下所示:
function selectImage(imagePath){
fabric.Image.fromURL(imagePath, function(oImg) {
canvas.add(oImg);
let zoom = 256 / oImg.width;
oImg.set({ scaleX: zoom, scaleY: zoom, });
oImg.center();
});
}
如果图像为 64px,它将缩放 4 到 256px,如果图像为 512px,它将缩放 0.5,这将使图像缩小到 256px。
你好我用fabricjs来玩htmlcanvas。 我创建了 canvas 并在其上添加了一组对象。
在一组对象上,我需要在缩放对象时保持某些对象的固定宽度和高度。
我使用 'object:scaling' 事件 在活动对象改变大小时获取它,我读取组中的每个对象并分配 元素[i].set({'radius':5}) 在我想保持不变的组对象上。
但结果是,所有组都反对调整大小。
我向您展示 object:scaling 事件的片段 :
canvas.on('object:scaling',function(e){
var activeObject1 = e.target;
var elements = e.target._objects;
var count_elements = elements.length;
for(var i = 0; i < count_elements; i++) {
var type = elements[i].typeCircle;
if(type == "parts"){
//elements[i].set({"radius":8,"fill":"#abcde2","stroke":"#367827"});
//elements[i].set('radius',8);
/*elements[i].setWidth(16);
elements[i].setHeight(16);
elements[i].currentWidth = 16;
elements[i].currentHeight = 16;
elements[i].scaleX = 1;
elements[i].scaleY = 1;
console.log(elements[i]);
canvas.renderAll();*/
}
}
});
我应该在 for 循环中写入什么以保持某些对象的固定大小? 我在上面使用的所有内容,除了 "fill":"#abcde2","stroke":"#367827"
外,它们都不起作用如果有人在 fabricjs 上遇到过类似的问题,请告诉我。
您必须使用 setScaleX() 和 setScaleY() 方法。 这是一个例子...
var Rect = new fabric.Rect({
width: 200,
height: 200,
top: 100,
left: 100,
fill: 'rgba(255,0,0,0.5)',
stroke: '#000',
strokeWidth: 1,
});
var Circle = new fabric.Circle({
left: 100,
top: 100,
fill: '#FF00FF',
stroke: 'red',
radius: 100,
opacity: 1,
});
var Group = new fabric.Group([Rect, Circle])
canvas.add(Group)
canvas.on({
'object:scaling': onChange
})
function onChange(obj) {
var circle = obj.target.item(1),
group = obj.target,
scaleX = circle.width / group.getWidth(),
scaleY = circle.height / group.getHeight();
circle.setScaleX(scaleX);
circle.setScaleY(scaleY);
}
使用 fabricjs2 停止缩放文本项我修改了 Rafik Avtoyan 的函数以使其运行良好。我已经为我的组锁定了 Y 缩放,所以如果需要你必须添加它。
function handleScalingEvent(obj) {
var text = obj.target.item(1),
group = obj.target,
scaleX = group.width / (group.width * group.scaleX);
text.set('scaleX', scaleX);
}
使对象大小相同的最佳方法是将所需宽度除以对象宽度。例如,如果您希望所有添加的对象都是 256px,代码将如下所示:
function selectImage(imagePath){
fabric.Image.fromURL(imagePath, function(oImg) {
canvas.add(oImg);
let zoom = 256 / oImg.width;
oImg.set({ scaleX: zoom, scaleY: zoom, });
oImg.center();
});
}
如果图像为 64px,它将缩放 4 到 256px,如果图像为 512px,它将缩放 0.5,这将使图像缩小到 256px。