gpt4 book ai didi

javascript - 缩放和平移后fabricJS中的对象对齐

转载 作者:行者123 更新时间:2023-12-04 13:28:20 26 4
gpt4 key购买 nike

我正在使用 fabricJSAngular例如,当我想将元素左对齐时,我使用以下方法

alignLeft() {
// Get Selected Elements
var obj = this.canvas.getActiveObject();

// if no element is selected
if (obj !== undefined) {
// Bounding Box of the selected element
var bound = obj.getBoundingRect();

obj.set('left', (obj.left - bound.left));
//this.canvas.getActiveObject().setCoords();
this.canvas.renderAll();
}
}
只有当缩放为 100% 时,对齐才会像魅力一样工作,如果我更改缩放或平移 Canvas ,一切都会以错误的方式进行。波纹管是我用来放大/缩小的方法
this.canvas.on('mouse:wheel', function (opt) {
var delta = opt.e.deltaY;
var zoom = this.canvas.getZoom();

zoom *= 0.999 ** delta;
if (zoom > 20) zoom = 20;
if (zoom < 0.01) zoom = 0.01;
this.canvas.zoomToPoint({ x: opt.e.offsetX, y: opt.e.offsetY }, zoom.toFixed(4));
opt.e.preventDefault();
opt.e.stopPropagation();
}.bind(this));

this.canvas.on('mouse:down', function (opt) {
var evt = opt.e;
if (evt.altKey === true) {
this.isDragging = true;
this.selection = false;
this.lastPosX = evt.clientX;
this.lastPosY = evt.clientY;
}
});

this.canvas.on('mouse:move', function (opt) {
if (this.isDragging) {
var e = opt.e;
var vpt = this.viewportTransform;
vpt[4] += e.clientX - this.lastPosX;
vpt[5] += e.clientY - this.lastPosY;
this.requestRenderAll();
this.lastPosX = e.clientX;
this.lastPosY = e.clientY;
}
});

this.canvas.on('mouse:up', function (opt) {
// on mouse up we want to recalculate new interaction
// for all objects, so we call setViewportTransform
this.setViewportTransform(this.viewportTransform);
this.isDragging = false;
this.selection = true;
});
看完后 multiple questionsfabricJS Documentation我换了 alignLeft()方法如下:
alignLeft() {
// Get Selected Elements
var obj = this.canvas.getActiveObject();

// if no element is selected
if (obj !== undefined) {
// Bounding Box of the selected element
var bound = obj.getBoundingRect();
let p = {x: (obj.width / 2), y: obj.top}
var invertedMatrix = fabric.util.invertTransform(this.canvas.viewportTransform);
let newp = fabric.util.transformPoint(p, invertedMatrix);

obj.set('left', newp.x);
//this.canvas.getActiveObject().setCoords();
this.canvas.renderAll();
}
}

最佳答案

您需要用户 ViewPortCoordinates (见 fabricJS Docs)得到 top left , top right , bottom left , bottom right canvas 的坐标根据视口(viewport)。

Describe canvas element extension over design properties are tl,tr,bl,br. if canvas is not zoomed/panned those points are the four corner of canvas if canvas is viewportTransformed you those points indicate the extension of canvas element in plain untrasformed coordinates The coordinates get updated with @method calcViewportBoundaries.


alignLeft()方法,您可以将其更新为以下内容:
alignLeft() {
// Get Selected Elements
var obj = this.canvas.getActiveObject();

// if no element is selected
if (obj !== undefined) {
const viwePortCoords = this.canvas.vptCoords;
obj.set('left', viwePortCoords.bl.x + (obj.width / 2));

this.canvas.renderAll();
}
this.canvas.fire('object:modified', { target: obj });
}

关于javascript - 缩放和平移后fabricJS中的对象对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66733081/

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