Skip to Content
API布局类型

布局类型

这一页只说明 Ansiq 里最常见、最值得先记住的布局类型。更深入的实现路径见:

Direction

Direction::Column Direction::Row

它决定容器按哪个轴堆叠子节点。

  • Column:垂直堆叠,常见于 Box::column()
  • Row:水平排列,常见于工具栏、状态区、双栏界面

Length

Layout 里的宽高不是像素,而是终端单元格长度策略:

Layout { width: Length::Fill, height: Length::Auto, }

最常用的三种值:

  • Length::Auto:按内容测量自然大小
  • Length::Fill:吃父容器剩余空间
  • Length::Fixed(n):固定为 n 个终端单元格

这也是为什么 ParagraphListInput 这些 widget 可以在同一个容器里自然组合。

Constraint

Table 和其他需要“分列”的部件更常用 Constraint

[ Constraint::Length(12), Constraint::Min(24), Constraint::Fill(1), ]

常见语义:

  • Length(n):固定列宽
  • Percentage(n):按父宽度百分比分配
  • Fill(weight):按权重分剩余宽度
  • Min(n) / Max(n):给列宽加边界

如果你写的是表格或多列明细页,优先从 Constraint 开始,而不是手动算字符宽度。

Flex

当列宽求解完之后,Flex 决定整列在剩余空间里怎么摆:

Flex::Start Flex::Center Flex::End Flex::SpaceBetween Flex::SpaceAround Flex::SpaceEvenly

最常见的是:

  • Start:列贴左边,剩余空间留在右边
  • Center:整组列居中
  • SpaceBetween:把多余空间塞进列间距

Padding 和 block inset

BlockPaneShell 这类容器不会让子节点直接占满外框,它们会先算自己的 inner(rect)

Padding::all(1) Padding::symmetric(2, 1)

你可以把它理解成:

outer rect -> border/title/padding -> inner rect -> children

如果看到“子节点好像没顶到边”,通常不是 layout 坏了,而是容器先做了 inset。

Shell 槽位布局

Shell 不是普通列布局,它是一个固定三槽模型:

  • header
  • body
  • footer

body 吃中间剩余空间,header/footer 保持可见。这类布局特别适合:

  • activity monitor
  • explorer
  • session shell

如果你需要的是普通堆叠,用 Box::column();如果你要的是“上下固定,中间滚动”,用 Shell

什么时候最值得看这些类型

  • 写自定义 widget 或组合件
  • 理解为什么某个区域会 Fill
  • 理解为什么 Table 的列宽和你预期不同
  • 调试 partial relayout 和 damage model
Last updated on