You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

缩放时如何调整Konva Label尺寸使其始终保持相对画布大小

实现方案

核心原理是通过对Label施加与画布缩放比例相反的缩放值,抵消画布缩放带来的Label视觉尺寸变化,实现固定大小展示。

具体实现步骤

  • 新增统一更新所有Label尺寸的公共方法
updateLabelSizes() {
  // 获取当前画布的缩放比例
  const scaleX = this.stage.scaleX()
  const scaleY = this.stage.scaleY()
  // 遍历图层中所有Label节点
  this.layer.find('Label').forEach(label => {
    // 施加逆缩放,抵消画布缩放的影响
    label.scaleX(1 / scaleX)
    label.scaleY(1 / scaleY)
  })
  // 批量重绘图层,提升性能
  this.layer.batchDraw()
}
  • 在画布缩放事件中调用上述更新方法
this.stage.on('wheel', function (e) {
  // 保留你原有实现的画布缩放逻辑
  // ...
  // 缩放完成后调用方法更新所有Label尺寸
  this.updateLabelSizes()
});
  • 新建Label时同步调用更新方法,保证刚创建的Label尺寸符合当前缩放比例
createMarker(point: any) {
    var label = createLabel(point.x, point.y);
    var tag = createTag();
    var text = createText();

    label.add(tag);
    label.add(text);

    this.layer.add(label);
    this.stage.add(this.layer);
    // 新增调用,适配当前画布缩放比例
    this.updateLabelSizes()
}

可选优化

如果场景中存在不需要固定尺寸的Label,可在创建时添加自定义属性标记,更新时仅处理目标Label:

// 创建Label时添加自定义标记
createLabel(x: number, y: number) {
    return new Konva.Label({
        x: x,
        y: y,
        opacity: 0.75,
        // 自定义属性,标记需要固定视觉尺寸
        keepStaticSize: true
    });
}

// 更新方法中筛选处理目标Label
updateLabelSizes() {
  const scaleX = this.stage.scaleX()
  const scaleY = this.stage.scaleY()
  this.layer.find('Label').forEach(label => {
    if (label.attrs.keepStaticSize) {
      label.scaleX(1 / scaleX)
      label.scaleY(1 / scaleY)
    }
  })
  this.layer.batchDraw()
}

该方案不需要单独调整Label内部Tag、Text的样式属性,内部元素会随Label整体缩放自动适配,保留原有样式比例。

内容的提问来源于stack exchange,提问作者Aeseir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:06:11