Html5 canvas 如何调整画布上文本的大小

Html5 canvas 如何调整画布上文本的大小,html5-canvas,fabricjs,Html5 Canvas,Fabricjs,我已经找到了一种方法,可以通过以下代码在普通HTML5画布上调整和压缩我的文本: $("input").on("input", function() { ctx.clearRect(0, 0, 400, 400); var width = ctx.measureText(text).width; if(width <= 100) { ctx.fillText(text, 0, 100); } else { ctx.save(); ctx.scale(100 / wi

我已经找到了一种方法,可以通过以下代码在普通HTML5画布上调整和压缩我的文本:

$("input").on("input", function() {
ctx.clearRect(0, 0, 400, 400);
var width = ctx.measureText(text).width;
if(width <= 100) {
    ctx.fillText(text, 0, 100);
} else {
    ctx.save();
    ctx.scale(100 / width, 1);
    ctx.fillText(text, 0, 100);
    ctx.restore();
}
$(“输入”)。关于(“输入”,函数(){
ctx.clearRect(0,040400);
var width=ctx.measureText(text).width;

如果(width是的,请在创建文本元素后检查其宽度,并在将其添加到画布之前根据需要设置ScaleX属性:

    var canvas = new fabric.Canvas('c');
    var t;

    canvas.renderAll();

    $("input").on("input", function () {
        if (t) {
            canvas.remove(t);
        }
        var textToDraw = $(this).val();
        t = new fabric.Text(textToDraw, {
            left: 0,
            top: 0
        });
        if (t.width > c.width) {
            console.log('scale -> ' + (c.width / t.width));
            t.setScaleX(c.width / t.width);
        }
        canvas.add(t);
    });
如果要在对象调整大小时执行此操作,请使用修改后的事件处理程序,如下所示:

    function scaleText() {
        console.log("scale=" + t.getScaleX() + " w=" + t.getWidth());
        if ((t.width * t.getScaleX()) > c.width) {
            t.setScaleX(c.width / t.width);
        }
    }

    $("input").on("input", function () {
        if (t) {
            canvas.remove(t);
        }
        var textToDraw = $(this).val();
        t = new fabric.Text(textToDraw, {
            left: 0,
            top: 0
        });
        scaleText();

        t.on("modified", function (options) {
            scaleText();
        });

        canvas.add(t);
    });

我想澄清的是,当对象帧处于画布的最大宽度且未调整高度(Y轴)的大小时,也就是说,如果文本太长,我希望将文本压缩在一起。我还做了另一个限制,使对象仅限于画布的大小,它们无法关闭。我遇到的问题是,当有人调整文本对象的大小时,我需要能够调整文本的大小,而不是在它调整大小之前已经写入画布。确实不清楚您想要实现什么,您是否能够生成JSFIDLE或类似的工具来说明问题?我正在尝试执行您提到的操作,但在文本写入画布后执行。我已添加到答案中,以显示当用户调整文本对象的大小时如何执行此操作