在fabric js中擦除iText时显示光标线代替擦除的字符

Posted

技术标签:

【中文标题】在fabric js中擦除iText时显示光标线代替擦除的字符【英文标题】:Display cursor line in place of erased character when iText erase in fabric js 【发布时间】:2019-06-06 00:07:02 【问题描述】:

我正在使用fabric js 1.7.22版 我正在做一个项目,我需要在其中添加文本并对其进行编辑。 当我在画布中添加新的 iText 并写一些文本并将其擦除时。它显示了旧的光标线代替了已擦除的字符,

我无法在小提琴中生成此问题所以请检查 GIF。 我不知道我错在哪里。 请帮帮我。

我的 Itext 添加的代码是这样的:

var text = new fabric.IText('Example heading', 
        left: 10,
        top: 10,
        fontFamily: 'Roboto-Regular',
        angle: 0,
        fontSize: fontSize,
        fill: '#000000',
        fontWeight: '',
        charSpacing: 0,
        shadow: 
            "color": "#000000",
            "blur": 0,
            "offsetX": 0,
            "offsetY": 0,
            "affectStroke": false
        ,
        hasRotatingPoint: true
    );
    canvas.add(text);

此问题是由文本缩放引起的。 该解决方案也适用于小提琴。但如果画布处于缩小模式,则问题将重新生成。 我为此附上了一个小提琴:

https://jsfiddle.net/Mark_1998/ro8gc3zh/5/

【问题讨论】:

我不明白你想通过 gif 找出什么问题。你能解释更多吗? 当 Itext 擦除时,有一些可见的行代替擦除的字符,这是问题。但是当我们取消选择 itext 对象时它会删除。通过鼠标或画布缩放缩放 itext 时会产生此问题。 【参考方案1】:

当 IText 光标移动时,fabric 调用text._clearTextArea() 以清除绘制光标的画布。一种可能的解决方案是通过修补fabric.IText.prototype._clearTextArea() 方法来稍微扩展该区域 - 足以在所有可能的情况下移除闪烁光标的痕迹:

fabric.IText.prototype._clearTextArea =  function(ctx) 
  // was 'this.width + 4'
  var width = this.width + this.fontSize * this.scaleX, height = this.height + 4;
  ctx.clearRect(-width / 2, -height / 2, width, height);

这是您应用补丁的示例:

fabric.IText.prototype._clearTextArea =  function(ctx) 
  var width = this.width + this.fontSize * this.scaleX, height = this.height + 4;
  ctx.clearRect(-width / 2, -height / 2, width, height);


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

var text = new fabric.IText('this is example text', 
  left: 20,
  top: 50,
  fill: 'red',
  scaleX: 0.5,
  fontFamily: 'verdana'
);
canvas.add(text);
canvas.setActiveObject(text);
canvas.getActiveObject().enterEditing();
canvas.renderAll();
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.js"></script>
<h1>
  Try to erase text from end
</h1>
<canvas id="c"  ></canvas>

这看起来有点老套,但它确实可以解决问题,因为没有更好的解决方案。更好的方法是从 fabric v2 反向移植 IText - 这个错误已修复。

【讨论】:

以上是关于在fabric js中擦除iText时显示光标线代替擦除的字符的主要内容,如果未能解决你的问题,请参考以下文章

在单个链表线程中擦除和插入是不是安全?

从向量中擦除指针

在 std::vector 中擦除、调试、发布

击败从内存中擦除 PE

Fabric.js 与 IText

Fabric.js - 分组 iText 不可编辑