gpt4 book ai didi

javascript - 使用 fabricjs 将 "bleed area"添加到 Canvas ?

转载 作者:行者123 更新时间:2023-11-29 10:30:20 24 4
gpt4 key购买 nike

我正在使用 fabricjs (1.7.20) 并想创建一种“出血区域”, Canvas 周围的一些空间用户无法使用;如果您愿意,可以使用一种“墙”来阻止对象移动到 Canvas 墙的两侧。我怎样才能做到这一点?

var canvas = new fabric.Canvas("c");
canvas.setHeight(350);
canvas.setWidth(350);

canvas.add(new fabric.IText("Some text", {
top: 25,
}));

var circle = new fabric.Circle({
radius: 20, fill: 'green', left: 100, top: 100
});
var triangle = new fabric.Triangle({
width: 20, height: 30, fill: 'blue', left: 150, top: 150
});

canvas.add(circle, triangle);
canvas {
border: 1px solid #dddddd;
margin-top: 10px;
border-radius: 3px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.20/fabric.min.js"></script>
<canvas id="c"></canvas>


有人向我建议,这是我得到的最接近的建议。我正在寻找这样做,但是距 Canvas 的边界 10px,不等。

canvas.on('object:moving', function (e) {
var obj = e.target;
// if object is too big ignore
if(obj.currentHeight > obj.canvas.height || obj.currentWidth > obj.canvas.width){
return;
}
obj.setCoords();
// top-left corner
if(obj.getBoundingRect().top < 0 || obj.getBoundingRect().left < 0){
obj.top = Math.max(obj.top, obj.top-obj.getBoundingRect().top);
obj.left = Math.max(obj.left, obj.left-obj.getBoundingRect().left);
}
// bot-right corner
if(obj.getBoundingRect().top+obj.getBoundingRect().height > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width > obj.canvas.width){
obj.top = Math.min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top);
obj.left = Math.min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left);
}
});

最佳答案

您可以通过从确定对象是否移出“出血”区域的条件中添加/减去值 10 来添加 10 像素的出血区域(我实际上更愿意称之为“填充”),并从将对象重新定位到填充边界内的计算中添加/减去。

这是一个有效的更新示例:

var padding = 10;
var canvas = new fabric.Canvas("c");

canvas.setHeight(350);
canvas.setWidth(350);

canvas.add(new fabric.IText("Some text", {
top: 25,
}));

var circle = new fabric.Circle({
radius: 20,
fill: 'green',
left: 100,
top: 100
});
var triangle = new fabric.Triangle({
width: 20,
height: 30,
fill: 'blue',
left: 150,
top: 150
});

canvas.add(circle, triangle);

canvas.on('object:moving', function(e) {
var obj = e.target;

// if object is too big ignore
if (obj.currentHeight > obj.canvas.height - padding * 2 ||
obj.currentWidth > obj.canvas.width - padding * 2) {
return;
}
obj.setCoords();

// top-left corner
if (obj.getBoundingRect().top < padding ||
obj.getBoundingRect().left < padding) {
obj.top = Math.max(obj.top, obj.top - obj.getBoundingRect().top + padding);
obj.left = Math.max(obj.left, obj.left - obj.getBoundingRect().left + padding);
}

// bot-right corner
if (obj.getBoundingRect().top + obj.getBoundingRect().height > obj.canvas.height - padding ||
obj.getBoundingRect().left + obj.getBoundingRect().width > obj.canvas.width - padding) {
obj.top = Math.min(
obj.top,
obj.canvas.height - obj.getBoundingRect().height + obj.top - obj.getBoundingRect().top - padding);
obj.left = Math.min(
obj.left,
obj.canvas.width - obj.getBoundingRect().width + obj.left - obj.getBoundingRect().left - padding);
}
});
canvas {
border: 1px solid #dddddd;
margin-top: 10px;
border-radius: 3px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.20/fabric.min.js"></script>
<canvas id="c"></canvas>

在第一行中,我定义了一个变量“padding”,它指的是所需的填充大小。这样,如果您想稍后更改填充,则不必在八个不同的地方进行更改。

在左上角的条件中使用的填充变量而不是 0。

如果“左上角”条件为真,则将填充添加到重新定位对象的计算中。

在“右下”部分,我们做相反的事情——我们从条件中减去填充,并从重新定位计算中减去。

您也可以试试这个 fiddle 中的代码:https://jsfiddle.net/pahund/hz7jLnme/

关于javascript - 使用 fabricjs 将 "bleed area"添加到 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com