2017-02-15 19 views
0

文字我已经找到一种方法,能够调整和挤压我的文字正常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(); 
} 

});

我想做同样的事情,但使用FabricJS。有什么方法可以做到吗?

+0

我想澄清,使得当对象帧是在画布的最大宽度,而不是调整大小上高度(Y轴),即,当我想如果文本太长,就把文本挤在一起。 – user5749747

+0

另一个限制,我也使这样的对象被限制为画布的大小,他们不能关闭 – user5749747

回答

0

对没错,只是检查文本元素的宽度您创建完成后,并将其添加到画布前,如果需要设置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); 
    }); 
+0

我遇到的问题是,当有人调整文本对象时,我需要能够调整大小文本,而不是在写入画布之前。 – user5749747

+0

你真的不清楚你想要达到什么目的,你能制作一个jsFiddle或类似的来说明问题吗? –

+0

我正在尝试做所提到的事情,但在文本写入画布后进行。 – user5749747