【问题标题】:How to create a scalable multi-line button in Godot?如何在 Godot 中创建可缩放的多行按钮?
【发布时间】:2022-12-20 05:54:48
【问题描述】:

Godot 中的 Button 只能容纳一行文本。我可以通过将 RichTextLabel 节点放在按钮内来克服这个限制。

现在按钮可以包含更多文本行,但当需要更多行时它的高度不会自动改变。相反,文本只是溢出:

当然,我可以手动将按钮的大小调整得更高,但我希望这会根据里面的文本量自动发生。具体来说,我以编程方式生成这些按钮的列表并显示在 HBoxContainer 中,其中一些按钮的文本较长,而另一些按钮的文本较短。

有没有办法用 Godot 布局工具来实现这一点?

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    由于 ButtonContainer 中,它控制着它的 rect_size。我们最多只能指定一个rect_min_size。没有布局预设让 Control 依赖于孩子 Control。因此,要回答发布的问题:不,我们无法使用 Godot 布局工具来实现这一点。我们需要一些脚本。


    我们需要根据RichTextLabelButton设置rect_min_size。我们可以通过 get_content_height 询问内容的高度。这也意味着我们需要预先设置宽度。但是,当我们设置文本时它不会立即更新(我们将使用yield)。


    显然你不希望Container 控制Button 的高度。如果是这样的话,我认为你可以删除size_flags_vertical 中的所有标志。

    关于宽度,因为正如我之前解释的那样,我们需要设置宽度来获得高度……我建议你让Container尽可能地扩展Button的宽度。这意味着在 size_flags_horizontal 上同时设置 Fill 和 Expand 标志。

    然后,将 RichTextLabel 正确设置为尽可能多地占用父级 Button 的宽度,您可以读取它的高度,并使用它来设置 Buttonrect_min_size 的高度。


    还有一件事:您想将RichTextLabel 的鼠标过滤器设置为忽略或通过,否则它将阻止按Button


    这是我想出的代码:

    var b := Button.new()
    b.size_flags_vertical = 0
    b.size_flags_horizontal = SIZE_EXPAND_FILL
    add_child(b)
    
    var l := RichTextLabel.new()
    l.mouse_filter = Control.MOUSE_FILTER_IGNORE
    l.set_anchors_and_margins_preset(Control.PRESET_WIDE)
    l.text = "Some
    Multiline
    Text"
    b.add_child(l)
    
    yield(get_tree(), "idle_frame")
    b.rect_min_size.y = l.get_content_height()
    

    我希望这会根据里面的文本量自动发生

    遗憾的是,更改文本不会调整大小,也不会更改 RichTextLabel 的最小大小。 RichTextLabel 没有“文本已更改”信号。也没有“bbcode 文本已更改”信号。此外,拦截这些属性可能不可行(请参阅append_bbcode等)。使用常规标签可能更容易。

    无论如何,我要建议的是制作一个包装RichTextLabelControl,提供您实际需要的任何界面,并且在您更改文本的任何方法中,之后,您执行与此等效的操作:

    yield(get_tree(), "idle_frame")
    b.rect_min_size.y = l.get_content_height()
    

    【讨论】:

    • 谢谢,这真的很有帮助。我在尝试围绕 RitchTextLabel 设置边距时也遇到了一些麻烦。最后在 Button 和 RitchTextLabel 之间放置了一个 MarginContainer,并将其添加到 min_size 更新代码中的标签高度:b.rect_min_size.y = l.get_content_height() + VERTICAL_MARGIN * 2
    • 此外,当控件被隐藏时,大小计算似乎不起作用。最初我在一个隐藏的容器中创建了这些按钮,它在动画结束时显示。更改我的代码以在需要显示时立即创建按钮。
    【解决方案2】:

    (戈多 3.x)

    在不使用脚本的情况下,也可以通过将两个节点作为同胞包装在容器中来实现相同的目标,例如 MarginContainer。启用 RichTextLabel 的 fit_content_height 属性,这将导致标签根据需要扩展容器的区域,进而调整按钮的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多