范围:七项核心设计决策的理由与结论。
1. 自界定泛型
Element<T extends Element<T>> 让每个 setter 返回具体子类型,链式 API 因此成立,整个框架的构建器模式都建立在这条自界定之上。
2. 单一事件入口
单一入口使输入系统可审计:所有优先级、焦点、捕获和覆盖层逻辑集中在一个 InteractionManager 文件中,Screen 子类只是轻量级转发器。
3. 惰性布局
惰性布局依靠 dirty 标志与 markDirty() 冒泡避免冗余的布局遍历。直接字段赋值(width = ...)不可用,因为它跳过 dirty 标记;链式 setter 则自动标记 dirty。
4. 覆盖层树为多根森林
覆盖层树采用多根森林而非单一栈结构,允许多个独立的覆盖层层次结构共存,例如带有自身工具提示的上下文菜单;同一元素重复推入会移动到最上层,不同元素互不替换。
5. 碰撞检测分层为 H0/H1/L1/H3/L3
命中检测按关注点分层:几何 (H0)、形状 (H1)、裁剪边界 (L1)、单树搜索 (H3)、全 UI 搜索 (L3)。组件仅覆盖 H1,其余各层自动组合。
6. 先关闭后分发
外部关闭不需要任何豁免机制:dismissOverlaysOutside 在事件分发之前运行,分发期间创建的新覆盖层在预分发清理期间尚不存在,因此不受影响。
7. 渲染和输入互为镜像
渲染与输入的方向互为镜像,因此视觉上最突出的元素始终首先获得输入机会:渲染从根→覆盖层(自底向上视觉堆叠),输入从覆盖层→根(自顶向下命中优先级)。