【问题标题】:context2d.strokeText() strokes the path under FF3.6/4context2d.strokeText() 描边FF3.6/4下的路径
【发布时间】:2011-06-09 01:36:17
【问题描述】:

我在 FF(3.6 和 4beta4)下遇到了一个奇怪的 strokeText 效果,我无法在 Chrome 或 Safari 下重现。 如果我绘制一个填充的路径形状(但不是描边),然后是描边的文本,则在调用 strokeText() 时会描边路径。

这是我的代码:

            var el = document.getElementById('canvas'),
            ctx = el.getContext('2d');

        ctx.save();
        // draw Rect
        ctx.beginPath();
        ctx.moveTo(100, 100);
        ctx.lineTo(200, 100);
        ctx.lineTo(200, 200);
        ctx.lineTo(100, 200);
        ctx.lineTo(100, 100);
        ctx.closePath();
        ctx.fillStyle = 'red';
        ctx.fill();

                    // draw Text
        ctx.save();         
        ctx.textAlign = 'start';
        ctx.fillStyle = "rgba(0,0,0,0.0)";
        ctx.strokeStyle = "blue";
        ctx.lineWidth = 2;
        ctx.font = "bold 35pt sans-serif";
        ctx.strokeText("Hello World !", 100, 280);  

        ctx.restore();

如果你运行它,矩形是蓝色的,而它不应该。

您是否发现此代码有问题,或者是 FF 中的错误?

谢谢!

【问题讨论】:

  • 你在 strokeText() 之前/之后尝试过 ctx.beginPath()/ctx.closePath() 吗?
  • 你是对的,它解决了这个问题。谢谢 ! (顺便说一句,我升级到 FF4beta8 并已修复。请参阅下面的我自己的答案。

标签: firefox html canvas


【解决方案1】:

它已在 Firefox 4 beta 8 中得到修复。(刚刚测试...)。 我认为相关的错误是:https://bugzilla.mozilla.org/show_bug.cgi?id=499628

【讨论】:

    【解决方案2】:

    这样画矩形怎么样?

    var el = document.getElementById('canvas'),
    ctx = el.getContext('2d');
    
    ctx.save();
    // draw Rect
    ctx.fillStyle = 'red';
    ctx.fillRect  (100, 100, 100, 100); // <===
    // draw Text
    ctx.save();         
    ctx.textAlign = 'start';
    ctx.fillStyle = "rgba(0,0,0,0.0)";
    ctx.strokeStyle = "blue";
    ctx.lineWidth = 2;
    ctx.font = "bold 35pt sans-serif";
    ctx.strokeText("Hello World !", 100, 280);  
    
    ctx.restore();
    

    EDIT below关于strokeText问题,看来如果你在绘制之前绘制文本并填充路径修复它

    var el = document.getElementById('canvas'),
    ctx = el.getContext('2d');
    
    // draw Text -> at first
    ctx.save();         
    ctx.textAlign = 'start';
    ctx.fillStyle = "rgba(0,0,0,0.0)";
    ctx.strokeStyle = "blue";
    ctx.lineWidth = 2;
    ctx.font = "bold 35pt sans-serif";
    ctx.strokeText("Hello World !", 100, 280);
    
    ctx.save();
    // draw Rect
    ctx.beginPath();
    ctx.moveTo(100, 100);
    ctx.lineTo(200, 100);
    ctx.lineTo(200, 200);
    ctx.lineTo(100, 200);
    ctx.lineTo(100, 100);
    ctx.closePath();
    ctx.fillStyle = 'red';
    ctx.fill();
    
    ctx.restore();
    

    【讨论】:

    • 确实解决了这个问题,谢谢。不幸的是,这种解决方法破坏了 z 顺序(文本可能被其他形状隐藏)。 FF 画布似乎有问题...
    • @Patrick 是的,我想是的......顺便说一句,在你的特殊情况下,使用 fillRect 会更好:)
    • 是的 :-) 但我并没有说实话 ;-) 我使用了包装画布 api 的 dojox.gfx。这里的代码大致是生成的。
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多