我有一个fabricjs画布,我需要能够对其进行缩放,并且可以多次更改其中的图像/对象。
为此,我第一次加载页面时设置了画布,如下所示:
fabric.Object.prototype.hasBorders = false;
fabric.Object.prototype.hasControls = false;
canvas = new fabric.Canvas('my_canvas', {renderOnAddRemove: false, stateful: false});
canvas.defaultCursor = "pointer";
canvas.backgroundImageStretch = false;
canvas.selection = false;
canvas.clear();
var image = document.getElementById('my_image');
if (image != null) {
imageSrc = image.src;
if(imageSrc.length > 0){
fabric.Image.fromURL(imageSrc, function(img) {
img = scaleImage(canvas, img); //shrinks the image to fit the canvas
img.selectable = false;
canvas.centerObject(img);
canvas.setActiveObject(img);
canvas.add(img);
});
}
}
canvas.deactivateAll().renderAll();
然后当我需要在画布中更改图像/对象或页面重新加载时,我尝试像这样重置画布:
canvas.clear();
canvas.remove(canvas.getActiveObject());
var image = document.getElementById('my_image');
if (image != null) {
imageSrc = image.src;
if(imageSrc.length > 0){
fabric.Image.fromURL(imageSrc, function(img) {
img = scaleImage(canvas, img); //shrinks the image to fit the canvas
img.selectable = false;
canvas.centerObject(img);
canvas.setActiveObject(img);
canvas.add(img);
});
}
}
不确定是否重要,但我改变图像的方式是通过更改“my_image”中的源并使用上述方法重置画布。
这很有效,直到我使用canvas.zoomToPoint
时,根据此线程,在此之后,当我重置缩放或在缩放时用鼠标单击画布时,图像/对象开始改变位置,似乎在左上角方向的每次变化中跳跃,最终从视图中消失。
重置缩放:
canvas.setZoom(1);
resetCanvas(); //(above method)
如何恢复图片/物体的位置?
我尝试了进行初始设置而非重置,视觉效果似乎可以,但实际上每次新设置都会增加一个新的上层画布,所以这样做是不好的。
有没有一种方法可以在不引起这种行为的情况下将画布重置为原始状态,并且仍然能够正确地缩放?