收藏
回答

CanvasContext.save,CanvasContext.restore 行为怪异?


ctx.font = ctx.font.replace(/\d+px/, "10px");

console.log(ctx.font);

ctx.save();


ctx.font = ctx.font.replace(/\d+px/, "18px");

ctx.restore();

console.log(ctx.font);

输出:

10px sans-serif

18px sans-serif

根据文档预期结果为:

10px sans-serif

10px sans-serif

根据文档save应当保存当前的上下文的字体,在测试过程中发现font不能保存

是否可以在save的相关文档补充一下哪些属性需要自己保存。


更新:

调用 restore 后,

fillText会使用 restore后 的字体信息,

font getter 会返回 restore前 的字体信息,

measureText 返回的宽度是使用 restore前的字体信息计算的。



最后一次编辑于  09-29
回答关注问题邀请回答
收藏

2 个回答

  • 社区技术运营专员-小柿子
    社区技术运营专员-小柿子
    09-29

    是有问题,这样操作的需求场景是?

    09-29
    赞同
    回复 2
    • #define true false
      #define true false
      09-29

      这个问题可以规避

      本来想画:

      结果画出来是


      牵引线线和文字没有对齐

      之前我的代码大概是:

      this.dataset = this._build_dataset(this.option);
      const groups = []
      for (let item of this.dataset) {
        let g = this._create_arc(item);
       
        this.ctx.save();
        g.layout();
        this.ctx.restore();
       
        groups.push(g);
      }
      this._ajust_text_boxs(groups);
      ......

      g的一些方法:

      class valueArc extends ArcGroup {
          _change_font_if_highlight() {
              if (!this.highlight) {
                  return;
              }
              this.ctx.font = this.ctx.font.replace(/\d+px/, "16px");
          }
       
       
          layout() {
              this._change_font_if_highlight();

              super.layout();

             \\this.text_box = CalctextRect(this.ctx, this.label);这个方法用到了measureText

          }
      .....

      现在把 _change_font_if_highlight 改成了 _reset_label_font 每次重新设置 font 已经解决了


      09-29
      回复
    • 社区技术运营专员-小柿子
      社区技术运营专员-小柿子
      09-29回复#define true false
      这个后续会修复
      09-29
      1
      回复
  • 卢霄霄
    卢霄霄
    09-29

    好像只是 ctx.font 在restore的时候值没有改回去,但实际效果是restore回去了。。

    09-29
    赞同
    回复 2
    • #define true false
      #define true false
      09-29
      fillText 的时候确实是有效果的,但是measureTex返回值是错误的
      09-29
      回复
    • 卢霄霄
      卢霄霄
      09-29回复#define true false
      卧槽 还真是。。
      09-29
      回复
问题标签