当前位置: 首页 > 知识库问答 >
问题:

Fabric JS:使用鼠标调整大小时增加字体大小而不只是缩放

江俊能
2023-03-14

我正在处理fabric js应用程序&当我们用鼠标调整字体大小时,我需要增加/减少字体大小
我试过的代码

null

var canvas = new fabric.Canvas('canvas');
$(document).ready(function() {
$('#text-font-size').keyup(function() {
        var val = $(this).val();
        if (isNaN(val)) {
            alert('please enter number');
            $(this).val('');
        }
        var activeObject = canvas.getActiveObject();
        activeObject.fontSize = val;
        canvas.renderAll();
    });
    $('#add-text-btn').click(function() {
        if ($('#text-font-size').val()) {
            var txtfontsize = $('#text-font-size').val();
        } else {
            var txtfontsize = 40;
        }
        var message = $('#add-text-value').val();
        //var txtfontfamily = $('#font-family').val();
        var new_text = new fabric.IText(message, {
            left: 100,
            top: 100,
            fontSize: txtfontsize,
            //fontFamily: txtfontfamily,
            fill: '#000'
        });
        canvas.add(new_text);
        canvas.setActiveObject(new_text);
    });

    canvas.on('object:selected', function(options) {
        if (options.target) {
            $("textarea#add-text-value").val(options.target.text);
            $("#text-font-size").val(options.target.fontSize);
        }
    });

    canvas.on('object:scaling', function(options) {
        if (options.target) {
            $("textarea#add-text-value").val(options.target.text);
            $("#text-font-size").val(options.target.fontSize);
        }
    });

    canvas.on('object:modified', function(options) {
        if (options.target) {
            $("textarea#add-text-value").val(options.target.text);
            $("#text-font-size").val(options.target.fontSize);
        }
    });

});
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="add-text-btn">Add text</button><br><br>
<textarea rows="7" id="add-text-value">Your Text Here</textarea>
<br>
<input id="text-font-size" type="text" class="form-control">
<canvas id='canvas' width="500" height="400" style="border:#000 1px solid;"></canvas>

null

但这只是缩放文本,而不是增加/减少字体大小,但我必须调整字体大小,就像这样

共有2个答案

苍元章
2023-03-14

虽然这可能不是最好的方法(我是Fabric的新手),但它适用于4.3.0版本:

canvas.on('text:changed', function (e) {
  console.log('Text:', e.target.text, e.target.text.length)
  let objectSelection = canvas.getActiveObject()
  switch (e.target.text.length) {
    case 10:
      console.log(`Text is ${e.target.text.length} characters in length.`)
      objectSelection.set('fontSize', 100)
      break
    case 15:
      console.log(`Text is ${e.target.text.length} characters in length.`)
      objectSelection.set('fontSize', 85)
      break
    case 25:
      console.log(`Text is ${e.target.text.length} characters in length.`)
      objectSelection.set('fontSize', 60)
      break
  }
})
canvas.on('text:editing:exited', function (e) {
  console.log('Text edited!')
})

我从另一个答案中得到了灵感,它也起到了作用。

燕宜修
2023-03-14

这个想法是使用canvas.on(“object:modified”)事件将缩放重置为1,并增加fontSize以适应新的大小。

建议添加Fabric.Object.LockunisCaling。

null

var canvas = new fabric.Canvas('canvas');
$(document).ready(function() {
  $('#text-font-size').keyup(function() {
    var val = $(this).val();
    if (isNaN(val)) {
      alert('please enter number');
      $(this).val('');
    }
    var activeObject = canvas.getActiveObject();
    activeObject.fontSize = val;
    canvas.renderAll();
  });
  $('#add-text-btn').click(function() {
    if ($('#text-font-size').val()) {
      var txtfontsize = $('#text-font-size').val();
    } else {
      var txtfontsize = 40;
    }
    var message = $('#add-text-value').val();
    //var txtfontfamily = $('#font-family').val();
    var new_text = new fabric.IText(message, {
      left: 100,
      top: 100,
      fontSize: txtfontsize,
      lockUniScaling: true,
      //fontFamily: txtfontfamily,
      fill: '#000'
    });
    canvas.add(new_text);
    canvas.setActiveObject(new_text);
  });

  canvas.on('object:selected', function(options) {
    if (options.target) {
      $("textarea#add-text-value").val(options.target.text);
      $("#text-font-size").val(options.target.fontSize);
    }
  });

  canvas.on('object:scaling', function(event) {
    if (event.target) {
      $("textarea#add-text-value").val(event.target.text);
      $("#text-font-size").val((event.target.fontSize * event.target.scaleX).toFixed(0));
    }
  });

  canvas.on('object:modified', function(event) {
    if (event.target) {
      event.target.fontSize *= event.target.scaleX;
      event.target.fontSize = event.target.fontSize.toFixed(0);
      event.target.scaleX = 1;
      event.target.scaleY = 1;
      event.target._clearCache();
      $("textarea#add-text-value").val(event.target.text);
      $("#text-font-size").val(event.target.fontSize);
    }
  });

});
<script src="//cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="add-text-btn">Add text</button>
<br>
<br>
<textarea rows="7" id="add-text-value">Your Text Here</textarea>
<br>
<input id="text-font-size" placeholder="fontsize" type="number" class="form-control">
<canvas id='canvas' width="500" height="400" style="border:#000 1px solid;"></canvas>
 类似资料:
  • 问题内容: 将矩形放在QGraphicsScene中并使其可以用鼠标移动后,如何用鼠标调整大小? 如果没有人知道答案,那么一个例子也可能很好,我正在使用PyQt4在Python中进行开发。 我知道这里有类似的问题,但它们分别没有回答我。 我的简化代码: 问题答案: 您将需要自己调整大小。要做到这一点,你需要继承和实现鼠标事件处理函数:,,。总体思路如下: 您创建了一组手柄,可用于调整形状的大小。

  • 问题内容: 我一直试图(徒劳地)建立一个页面,当我更改窗口大小时,其元素将重新调整大小。我可以在CSS中使用它来处理图像,但是没有问题,但是我似乎无法在文本上完成相同的操作,而且我不确定在CSS中是否有可能。而且我似乎找不到能完成此任务的jQuery脚本。 当用户调整窗口大小时,我实质上希望页面能够动态流畅地缩放,而无需用户调用页面缩放。通过css在我的img div上这可以正常工作,但对于文本则

  • 问题内容: 它由9个框组成,中间带有文本。我已经制作了框,以便它们可以随着屏幕大小的变化而调整大小,以便始终保持在同一位置。 但是,即使我使用百分比,文本也不会调整大小。 如何调整文本的大小,使其在整个页面上始终具有相同的比例? 这是处理多种分辨率的合适解决方案吗?还是我应该在CSS中进行很多检查并为每种媒体类型设置许多布局? ``` html, body { } #launchmain { }

  • 我想在我的Android应用程序中增加位图的大小。 基本上,我想创建一个新的位图,其宽度与原始位图相同,但高度更大。(新)额外像素的背景可以是黑色、白色或透明。 我该怎么做?

  • 我想在我的网页中创建一个/菜单,该菜单包含四个链接(水平地位于页面的顶部中心)。 并且我希望当鼠标悬停在上面()时,菜单链接的字体大小增加。 但我遇到的问题是,当字体大小增大时(在和)菜单项会改变它的位置(下了一点),我不希望发生这种情况,请注意,我使用的是背景图像(152*52)作为链接 我尝试使用而不是,但它造成了更大的混乱。 我还试着玩了和,但也不起作用。 我是HTML/CSS的新手,所以任

  • 问题内容: 我想拍摄一张图像并更改图像的比例,虽然它是一个numpy数组。 例如,我有一个可口可乐瓶的图像: bottle-1 转换为一个numpy的形状数组,我想调整其大小以表示第二个图像的大小: bottle-2 形状为。 如何在保持原始图像的同时将图像尺寸更改为特定形状?其他答案建议每隔一行或第三行剥离,但是我想要做的基本上是像通过图像编辑器(但在python代码中)那样收缩图像。是否有任何