在 Fabric.js 中调整基于文本的对象大小时,如何防止所包含文本的垂直和水平拉伸?

ale*_*lex 1 javascript draw html5-canvas fabricjs

我希望能够缩放基于文本的对象(例如,使用 IText、Textbox 的类和子类)而不拉伸对象内部的文本。缩放和移动的交互是在用户端 (UI) 进行的,而不是以编程方式进行的(我正在使用绘图编辑器)。

在此处输入图片说明

我正在寻找的行为类似于便签应用程序中的行为:您可以缩放纸张,但此操作也不会缩放您的文本。

我已经检查过了,但这仅用于水平预防:Fabric.js 如何在不拉伸文本的情况下水平调整 IText 的大小

这既不是我想要的/意思:Fabric.js : How to set a custom size to Text or IText?

我知道不同于 1 的缩放因子意味着内部文本的拉伸,并且通过更改widthheight我可以在保持文本未缩放的同时调整对象大小,因此我尝试在缩放期间使用事件侦听器更新这些。

我尝试了 IText,Textbox 与一些缩放事件的多种组合,如下所示:

fbtext.on('scaling', function() {
                      this.set({
                        width : this.width  * this.scaleX,
                        height: this.height * this.scaleY,
                        scaleX: 1,
                        scaleY: 1,
                      });
                    });
Run Code Online (Sandbox Code Playgroud)

我也用文本框试过这个:

fbtext.on('scaling', function() {
                      this.set({
                        height: this.height * this.scaleY,
                      });
                    });
Run Code Online (Sandbox Code Playgroud)

但到目前为止没有任何效果。我没有想法。

Iva*_*van 6

var canvas = new fabric.Canvas('mycanvas');

let textbox = new fabric.Textbox("Sample text", {
   left: 100,
   top: 100
});

let lastHeight;

const updateTextSize = () => {	

  const controlPoint = textbox.__corner;

  //mr and ml are the only controlPoints that dont modify textbox height
  if( controlPoint && controlPoint != "mr" && controlPoint != "ml"){
 	   lastHeight =  textbox.height * textbox.scaleY;			
  }

  textbox.set({		
  	 height: lastHeight || textbox.height,
	 scaleY:1				
  });
  
  canvas.renderAll();
};
		
	
textbox.on('scaling', updateTextSize );
textbox.on('editing:entered', updateTextSize);
canvas.on('text:changed', updateTextSize);
  
canvas.add(textbox);
Run Code Online (Sandbox Code Playgroud)
canvas {
    border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.3.2/fabric.min.js"></script>
<canvas id="mycanvas" width="400" height="400"></canvas>
Run Code Online (Sandbox Code Playgroud)

这是一个代码示例,可让您在不拉伸文本的情况下修改“便笺大小”