gpt4 book ai didi

javascript - 将 fabric.js 对象与 IText 元素的内部文本的左上角对齐

转载 作者:行者123 更新时间:2023-11-30 00:20:53 33 4
gpt4 key购买 nike

http://jsfiddle.net/541ev5nh/15/

我试图将红色文本对象与黑色 IText 对象的左上角对齐。当 Itext 对象未旋转( Angular 0)时,您可以看到文本已正确对齐。但是,旋转 IText 会使对齐失效。

调整 IText 的文本大小或更改文本也会影响对齐,但现在不要担心。轮换是现在唯一需要工作的事情。

问题显然是因为我使用魔数(Magic Number)来对齐两个项目。我需要一种公式化的方法来导出这些数字,以便在旋转 IText 时保持对齐一致。有什么想法吗?

HTML:

<canvas id="canvas" width="800" height="600" style=""></canvas>

Javascript:

var w = 800;
var h = 600;
var cx = w/2;
var cy = h/2;

var auto = false; // auto/manual rotation

// Main "Text"
var txt = "Text";
var canvas = new fabric.Canvas('canvas');
var text = new fabric.IText(txt, {
left: 20,
top: 30,
fontFamily: 'sans-serif',
fontSize: 80
});
canvas.add(text);
var pt = new fabric.Point(cx,cy);
text.setPositionByOrigin(pt, 'center', 'center');
canvas.setActiveObject(text);


// decorator
var txt = "Top left";
var deco = new fabric.Text(txt, {
left: 20,
top: 30,
fontFamily: 'sans-serif',
fontSize: 14,
stroke: '#DD0000',
fill: '#DD0000'
});
canvas.add(deco);


canvas.on('object:modified', onModified);

function onModified(data){
var rotatedPoint = data.target.getPointByOrigin("left", "top");
deco.rotate(data.target.angle);
deco.setPositionByOrigin(new fabric.Point(rotatedPoint.x + 1, rotatedPoint.y + 11), 'left', 'top');
canvas.renderAll();
}

var angle = -2;

if (auto){
setInterval(onInterval, 30);
}
else{
onInterval();
text.setCoords();
}

function onInterval(){
angle += 2;
text.rotate(angle);
var data = {
target: text
};
onModified (data);
}

最佳答案

您可以通过将对象分组 来实现这一点。 Fabric 对对象组有很好的支持。
看这里:

// Main "Text"
var txt = "Text";
var canvas = new fabric.Canvas('canvas');
canvas.clear();
var text = new fabric.IText(txt, {
fontFamily: 'sans-serif',
fontSize: 80
});
// decorator
var txt = "Top left";
var deco = new fabric.Text(txt, {
top:10,
fontFamily: 'sans-serif',
fontSize: 14,
stroke: '#DD0000',
fill: '#DD0000'
});

var group = new fabric.Group([ text, deco ], {
angle: 0
});

var lefts=canvas.getWidth()/2-group.getWidth()/2;
var tops=canvas.getHeight()/2-group.getHeight()/2;
group.set({
'left':lefts,
'top':tops
});
canvas.add(group);
canvas.renderAll();

See in Fiddler

关于javascript - 将 fabric.js 对象与 IText 元素的内部文本的左上角对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33219410/

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