视口与绘制上下文(viewport 包)
基本信息
| 属性 |
值 |
| 包路径 |
com.cleanroommc.modularui.screen.viewport |
| 文件数 |
7 |
| 继承链 |
IViewportStack(接口)→ GuiViewportStack(:21)→ GuiContext(:25)→ ModularGuiContext(:41) |
| 坐标变换 |
TransformationMatrix(TransformationMatrix.java:15) |
功能
类层次
| 类 |
文件:行 |
继承 / 实现 |
作用 |
GuiViewportStack |
viewport/GuiViewportStack.java:21 |
implements IViewportStack(api/layout/IViewportStack.java) |
维护视口栈,提供坐标变换的压栈/弹栈 |
GuiContext |
viewport/GuiContext.java:25 |
extends GuiViewportStack |
在栈上叠加当前鼠标、按键等输入状态 |
ModularGuiContext |
viewport/ModularGuiContext.java:41 |
extends GuiContext |
实际传给所有控件绘制方法的对象 |
TransformationMatrix |
viewport/TransformationMatrix.java:15 |
— |
3×3 仿射变换矩阵(缩放/平移) |
DeferredRenderQueue |
viewport/DeferredRenderQueue.java |
— |
延迟渲染队列 |
LocatedElement<T> |
viewport/LocatedElement.java:7 |
泛型 |
已定位的元素 |
LocatedWidget |
viewport/LocatedWidget.java:13 |
extends LocatedElement<IWidget> |
已定位的控件 |
ModularGuiContext 的使用面
ModularGuiContext 是控件与世界交互的唯一上下文。
Widget 的 4 个绘制方法全部以它为第一个参数
(widget/Widget.java:151、:177、:189、:203):
public void drawBackground(ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void draw (ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void drawOverlay (ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void drawForeground (ModularGuiContext context)
命中测试
IWidget.isInside(IViewportStack stack, int mx, int my)(api/widget/IWidget.java:79)
与带 absolute 参数的重载(:93)接受视口栈而非裸坐标——
因此嵌在滚动区、变换控件或缩放区域里的控件能正确判断鼠标是否在自己身上。
IWidget 的默认实现从 stack 取出当前矩阵后逐层回溯比较(:94-95 起的局部变量)。
实现 IViewport 的控件
IViewport(api/layout/IViewport.java)意味着该控件提供自己的坐标视口,
子控件的坐标相对它解释。实现者包括:
| 控件 |
文件 |
ModularPanel |
screen/ModularPanel.java:63 |
DragHandle |
widget/DragHandle.java |
DraggableWidget |
widget/DraggableWidget.java:16 |
AbstractScrollWidget |
widget/AbstractScrollWidget.java:29 |
Expandable |
widgets/Expandable.java |
数值
| 数值名 |
值 |
来源 |
| 变换矩阵类型 |
仿射(缩放 + 平移) |
viewport/TransformationMatrix.java:15 |
交互
- 鼠标位置、按键状态由
GuiContext 提供,控件从 ModularGuiContext 读取
- 事件分发顺序由
IViewportStack 的压栈顺序决定
DeferredRenderQueue 让控件把绘制指令延后到当前帧末尾统一提交
相关条目
- 界面与面板 - 持有并使用本包
- 核心接口 -
IViewport / IViewportStack 定义
- 尺寸计算 -
Area / Unit 与变换矩阵的配合