布局容器(Flow / Row / Column / Grid)
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | com.cleanroommc.modularui.widgets.layout |
| 文件数 | 6 |
| 布局标记接口 | ILayoutWidget(api/layout/ILayoutWidget.java) |
| 展开接口 | IExpander(widgets/layout/IExpander.java) |
功能
类层次
| 类 | 文件:行 | 继承 | 说明 |
|---|---|---|---|
Flow |
widgets/layout/Flow.java:20 |
ParentWidget<Flow> implements ILayoutWidget |
通用流式布局,可横可纵 |
Row |
widgets/layout/Row.java:9 |
Flow |
横向流,语义化快捷方式 |
Column |
widgets/layout/Column.java:9 |
Flow |
纵向流 |
Grid |
widgets/layout/Grid.java:31 |
AbstractScrollWidget<IWidget, Grid> implements ILayoutWidget, IParentWidget |
网格布局,自带滚动 |
SimpleFlow |
widgets/layout/SimpleFlow.java:15 |
— | 「一排同构元素」的轻量描述,供 Flow 内部排版用 |
IExpander |
widgets/layout/IExpander.java |
接口 | 元素如何占据多余空间 |
Row 与 Column 都只是 Flow 的子类,没有独立逻辑——它们存在的意义是让调用方少写一个参数。
Flow 的三个静态快捷方式
Flow 提供 3 个静态工厂(Flow.java:22、:26、:30):
| 方法 | 行 | 说明 |
|---|---|---|
Flow.row() |
:22 |
横向 |
Flow.column() |
:26 |
纵向 |
Flow.col() |
:30 |
column() 的缩写 |
另有静态工具 Flow.layoutCrossAxisListLike(IWidget, List<SimpleFlow>, GuiAxis, Alignment.CrossAxis, int)
(:208),把一个 List<SimpleFlow> 按某个轴排布,供 CategoryList 之类使用。
Grid 的静态构造工具
Grid 提供 7 个静态方法把任意列表/矩阵铺成网格
(Grid.java:510-:577):
| 方法 | 行 | 作用 |
|---|---|---|
mapToMatrix(int rowLength, List<T>, IndexedElementMapper<T,I>) |
:510 |
列表按行宽折成矩阵 |
createGridOfElements(Iterable<? extends Iterable<T>>, GridPosElementMapper<T,I>) |
:514 |
二维集合直接建网格 |
createGridOfWidthElements(int width, Iterable<T>, GridPosElementMapper<T,I>) |
:533 |
按列数铺平列表 |
mapToMatrix(int rowLength, int size, IntFunction<I>) |
:555 |
纯下标建矩阵 |
createGridOfWidthHeight(int width, int height, GridPosMapper<I>) |
:559 |
指定宽高 |
createGridOfSizeHeight(int size, int height, GridPosMapper<I>) |
:573 |
指定元素数与高度 |
createGridOfSizeWidth(int size, int width, GridPosMapper<I>) |
:577 |
指定元素数与宽度 |
这些方法返回的是 List<List<I>>(二维列表),不是 Grid 实例——
需要自行 .child(...) 填入 Grid。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 元素间距 | 由 Widget 的 margin / padding 决定,布局容器无固定值 |
—— |
| 对齐方式 | Alignment(utils/Alignment.java),含 CrossAxis 枚举 |
Flow.java:208 参数 |
| 轴 | GuiAxis.X / GuiAxis.Y(api/GuiAxis.java) |
RichTooltip.Pos 亦用它 |
交互
布局容器本身不处理输入,只做尺寸分配与子控件定位:
- 尺寸计算走
widget/sizer/体系,见 尺寸计算 IPositioned.requiresResize()/scheduleResize()(api/widget/IPositioned.java:27/:29)在子控件变化时触发重排coverChildrenWidth()/coverChildrenHeight()(IPositioned.java:36/:40)让容器自动贴合子控件大小
相关条目
- 尺寸计算 -
Area/Box/StandardResizer等布局数学 - Widget 基类与层级 -
ParentWidget的定义 - 滚动控件 -
Grid建立在滚动基类上