尺寸计算(widget/sizer)

基本信息

属性 值
包路径 com.cleanroommc.modularui.widget.sizer
文件数 12
抽象根 ResizeNode(sizer/ResizeNode.java:13,abstract,implements IResizeable, ITreeNode<ResizeNode>)
尺寸单位 Unit(sizer/Unit.java:10)

ModularUI2 的布局数学完全由这一包承担:Flow / Grid 只是决定谁在第几格, 真正算出每个控件的 x/y/width/height 的是 sizer/ 里的 Resizer 树。

功能

类层次

ResizeNode (sizer/ResizeNode.java:13)          abstract, implements IResizeable, ITreeNode<ResizeNode>
├── WidgetResizeNode (sizer/WidgetResizeNode.java:8)     abstract
│   └── StandardResizer (sizer/StandardResizer.java:23)  implements IPositioned<StandardResizer>
│       ├── DelegatingResizer (sizer/DelegatingResizer.java:5)
│       └── ExpanderResizer (sizer/ExpanderResizer.java:7)  implements IExpander
└── StaticResizer (sizer/StaticResizer.java:5)            abstract
    ├── AreaResizer (sizer/AreaResizer.java:3)
    └── ScreenResizeNode (sizer/ScreenResizeNode.java:5)

DimensionSizer (sizer/DimensionSizer.java:19)  独立,不继承 ResizeNode
Box            (sizer/Box.java:16)             独立,implements IAnimatable<Box>
Unit           (sizer/Unit.java:10)            独立

AreaResizer(sizer/AreaResizer.java:3)与 ScreenResizeNode 继承的是 StaticResizer,而 DelegatingResizer / ExpanderResizer 继承的是 StandardResizer——两条分支不能靠目录顺序推断。

几何类型

类 文件:行 继承 说明
Area sizer/Area.java:19 Rectangle(drawable/Rectangle.java)implements IAnimatable<Area> 可动画的矩形区域;ScrollArea 与它同源
Box sizer/Box.java:16 implements IAnimatable<Box> 四边盒模型(上下左右内边距)
Unit sizer/Unit.java:10 — 单个布局标量,布局系统的原子单位

Unit:布局的原子单位

每个 Unit 描述「某个轴上的一个量」(位置或尺寸),字段见 sizer/Unit.java:30-37:

字段 行 类型 说明
autoAnchor :30 boolean 自动锚定(默认 true)
value :31 float 数值
valueSupplier :32 DoubleSupplier 动态取值(可为空)
measure :33 Measure 单位制,默认 PIXEL
anchor :34 float 锚点
offset :35 int 偏移
state :37 State 该量是「起点 / 终点 / 尺寸」,默认 UNUSED

Unit.State(sizer/Unit.java:12)有 4 个常量, 每个同时携带 X 与 Y 两个方向的文本名(:18 的 xText, yText):

常量 行 xText yText
UNUSED :13 "" ""
START :14 LEFT TOP
END :15 RIGHT BOTTOM
SIZE :16 WIDTH HEIGHT

Unit.Measure(sizer/Unit.java:125)只有 2 个常量:PIXEL、RELATIVE (:126,即像素与百分比)。

数值

数值名 值 来源
Unit 默认单位制 Measure.PIXEL sizer/Unit.java:33
Unit 默认锚定 autoAnchor = true sizer/Unit.java:30
Unit 默认状态 State.UNUSED sizer/Unit.java:37
可用单位制 PIXEL / RELATIVE sizer/Unit.java:126

交互

尺寸计算无直接输入事件;重排由以下链路触发:

  • IPositioned.requiresResize() / scheduleResize()(api/widget/IPositioned.java:27/:29)
  • ResizeNode implements IResizeable, ITreeNode(sizer/ResizeNode.java:13)——resizer 自成树, 尺寸沿树向下传播
  • StandardResizer 同时 implements IPositioned<StandardResizer>(sizer/StandardResizer.java:23), 因此它既参与布局又能被定位

相关条目