Using Containers

锚点 是处理图形用户界面中基本多分辨率处理的不同纵横比的有效方法,

对于更复杂的用户界面,它们可能会变得难以使用.

这通常是游戏的情况下,如角色扮演类、在线聊天、大富翁类或模拟类游戏.另一个需要更高级布局功能的常见情况是游戏内工具(或者仅仅是工具).

这些情况需要一个更强大的类似操作系统的用户界面,具有先进的布局和格式.为此, 容器 更有用.

容器布局

容器提供了巨大的布局能力(例如,Godot编辑器的用户界面就是完全使用它们完成的):

../../_images/godot_containers.png

当使用 容器 派生节点时,所有 控件 子节点放弃了自己的定位能力.这意味着 Container容器 将控制它们的位置,任何手动更改这些节点的尝试,都将在它们的父节点下一次调整大小时被忽略或失效.

同样,当一个 Container 派生的节点被调整大小时,它的所有子节点将根据它重新定位,其行为基于所用的容器类型:

../../_images/container_example.gif

例如 HBoxContainer 调整子按钮的大小.

容器的真正优势在于它们可以嵌套(作为节点),允许创建非常复杂的布局,调整毫不费力.

大小标志

当向容器添加节点时,容器对待每个子元素的方式,主要取决于它们的 size flags尺寸标记 .通过检查 容器 的子控件,可以找到这些标记.

../../_images/container_size_flags.png

尺寸标记独立于垂直和水平尺寸,并不是所有容器都使用它们(但大多数容器都使用):

  • Fill填充: 确保控件 fills填充 容器内指定的区域.无论控件是否 expands扩展 (见下面),当此选项被选中时(默认情况),只 填充 指定区域.

  • Expand扩展: 试图在父容器中尽可能多地使用空间(在每个轴中).不展开的控件会被展开的控件推开.在扩展的控件之间,它们相互占用的空间大小由 Ratio 决定(见下文).

  • Shrink Center收缩中心 当扩展时(如果不填充),尽量保持在扩展区域的中心(默认情况下,它仍然位于左侧或顶部).

  • Ratio比例 扩展控件之间,相互占用可用空间的简单比例.一个比例为”2”的控件,将占用比例为”1”控件的两倍可用空间.

建议使用这些标记和不同的容器进行试验,以便更好地了解它们是如何工作的.

容器类型

Godot提供了几种开箱即用的容器类型,因为它们有不同的用途:

Box容器

垂直或水平排列子控件(通过 水平盒子容器垂直盒子容器 ).在指定方向的相反方向(如水平容器的垂直方向),只是扩大了子节点的范围.

../../_images/containers_box.png

这些容器使用 Ratio比例 属性,用于设置 Expand扩展 标记的子容器.

Grid Container网格容器

在网格布局中排列子控件(通过 网格容器 ,必须指定列的数量).同时使用垂直和水平扩展标记.

../../_images/containers_grid.png

Margin Container边距容器

子控件被扩展到该控件的边界(通过 边距容器 ).根据主题配置,将在页边距上添加填充.

../../_images/containers_margin.png

同样,请记住,边距是一个 Theme 值,所以它们需要从每个控件的常量重写部分进行编辑:

../../_images/containers_margin_constants.png

Tab Container标签容器

允许您将多个子控件堆叠在一起(通过 选项卡容器),只有 current当前 可见.

../../_images/containers_tab.png

通过点击位于容器顶部的选项卡,来标记 current当前 选项卡:

../../_images/containers_tab_click.gif

默认情况下,标题是由节点名称生成的(尽管它们可以通过 TabContainer API被重写).

TabContainer选项卡容器 主题覆盖中,可以修改选项卡位置和 StyleBox盒子样式 等内容.

Split Container拆分容器

只接受一两个子控件,然后将它们与除数并排放置(通过 水平分割容器垂直分割容器).同时考虑水平和垂直标记,以及 Ratio比例 .

../../_images/containers_split.png

可以拖动除数来改变两个子元素之间的大小关系:

../../_images/containers_split_drag.gif

PanelContainer

绘制 StyleBox样式盒子 的简单容器,然后将子节点扩大到整个区域(通过 面板容器 ,考虑 样式盒子 的边距).它同时考虑水平和垂直尺寸标记.

../../_images/containers_panel.png

这个容器作为顶层非常有用,或者只是为布局各个部分添加自定义背景.

ScrollContainer

接受一个单独的子节点.如果这个节点比容器大,将添加滚动条以允许移动节点(通过 滚动条容器).考虑垂直和水平尺寸标识,该行为可以在属性中的每个轴上打开或关闭.

../../_images/containers_scroll.png

鼠标滚轮和触摸拖动(当触摸可用时)也是平移子控件的有效方法.

../../_images/containers_center_pan.gif

在上面的例子中,使用此容器最常见的方法之一,是将 VBoxContainer垂直盒子容器 作为子容器一起使用.

ViewportContainer

这是一个特殊的控件,它只接受单个 Viewport视窗 节点作为子节点,它会像显示图像一样显示它(通过 视窗容器).

创建自定义容器

可以使用脚本轻松地创建自定义容器.下面是一个简单容器的例子,它适合于其矩形大小的子容器:

GDScript

  1. extends Container
  2. func _notification(what):
  3. if (what==NOTIFICATION_SORT_CHILDREN):
  4. # Must re-sort the children
  5. for c in get_children():
  6. # Fit to own size
  7. fit_child_in_rect( c, Rect2( Vector2(), rect_size ) )
  8. func set_some_setting():
  9. # Some setting changed, ask for children re-sort
  10. queue_sort()