POLARISUI / DOCUMENTATION / 2.4.5

禁止商用。所有使用 PolarisUI 的应用都必须公开完整源码。查看许可条款

2.4.1 间距和圆角裁剪

本页内容

列表与侧边栏

ListBox / Sidebar 的内容范围由 contentBounds() 统一计算。padding(float) 对四边使用相同外留白,默认 12 个逻辑像素;列表行内部文字留白同样左右对称。rowBounds(int) 返回真实显示位置,包含平滑滚动,不再由绘制和事件各自推算不同的 +4/+5/+6 偏移。

rowHeight(float) 是行节距,包含行尾 gap。ListBox 默认节距 32、gap 4;Sidebar 默认节距 43、gap 12。行与行之间的空隙不当作另一个不可见按钮。

只有实际溢出时才为滚动条保留 12 个逻辑像素的通道;不存在滚动条时不额外扣除右边宽度。增减列表数据和调整大小会重新计算。GridView 的格子也统一使用内容内边距和 12 的网格间距。

Sidebar 默认 glass=false,仅绘制选中项,不再套一个大底板。ListBox 保留独立列表表面,宿主已经提供面板时可使用 list.glass(false)。颜色、tint、原有选择动画和键盘行为保留。

展示程序的滚动视口采用两侧/上下同为 16 的内容留白;去除了页面末尾重复叠加的空白高度,内容能放下时不再因为虚增高度而出现滚动条。

轮廓与内容裁剪一致

以前的 clip(Rect) 仍然保留,负责矩形 viewport、局部文字边界和宿主 scissor。现在增加独立的形状裁剪栈:

painter.pushShapeClip(bounds, radius, cornerProfile);
try {
    // glass / fill / text / line / ring / colorPlane ...
} finally {
    painter.popShapeClip();
}

这是片元覆盖率约束,不会绘制一块额外的白色、黑色或半透明底板。NativePainter 将 push/pop 写进指令流,OpenGL 将最多 32 层的轮廓参数传给着色器。每层使用与表面绘制完全相同的 boxFieldProfile 距离函数,并继承该层的 AA 模式。嵌套轮廓取覆盖范围的交集。

圆形模式保持圆形;四角独立的三次贝塞尔使用同一组半径与控制柄。父子内容可以溢出矩形位置,但最终像素不会越过父级的曲线轮廓。文字也参与此裁剪,而不是只裁玻璃颜色。

Panel 默认 clipChildren(true),在绘完自己的表面之后,为后代压入对应轮廓;这样不会把表面自己的高光当作子内容再次切掉。Panel.glass(false) 且没有显式圆角配置时,仍然是无底板的矩形布局容器,不会凭空制造圆角面板。显式调用 clipChildren(false) 仍可允许有意的子控件溢出。

ListBox、GridView、TreeView 和 Table 的内部绘图也进入相应的内容裁剪范围。菜单和模态等真正的弹出层不留在原来的父级裁剪栈里,关闭一个层也不会把裁剪状态带给后面的兄弟控件。

动画修复

原 TransformPainter 会把继承的 viewport 当作控件本地内容一并缩放。现在继承的矩形裁剪范围保持不变,只变换真正的局部裁剪与形状轮廓。父级的剪裁不再跟着子按钮按压缩小,父级内容轮廓仍然随父级本身的缩放/移动一起变化。

自定义后端兼容与边界

Painter 的新增方法有 default 实现,原有 Java 自定义 Painter 仍可编译;但 default 是无额外形状裁剪,不会神奇获得 GPU 贝塞尔能力。自行实现 Painter 的宿主应覆盖这两个方法,并按成对、嵌套、交集语义处理。原有矩形 clip 仍会传递。

附带 NativePainter/native 最多 32 层形状裁剪,超出、少 pop 或多 pop 会明确报错,不静默破坏下一帧。Java/native 协议从 24064 改为 24164;旧 DLL 与新 Java 混用会在初始化时被拒绝。

这里不是任意路径剪裁或 stencil 图形引擎;不额外要求宿主 framebuffer 提供 stencil 附件。宿主已有 stencil/depth 仍按原接口约定在 UI 合成阶段暂时停用并恢复。圆角命中仍以控件的逻辑矩形为基础,本次没有引入 CPU 逐像素 SDF 生成或 CPU 图像遮罩。

实际验证

新增 23 项布局/状态检查和 23 项真实 OpenGL 像素检查。对比同一四角曲线的可见轮廓与裁剪轮廓,涵盖三种 AA、移动、2 倍逻辑缩放、叠加裁剪、空裁剪、32 层嵌套、各类图元、背景模糊 barrier、动画变换及宿主状态恢复。完整记录见根目录 TEST-REPORT.md。

依据 SDK 2.4.5 随包文档 docs/CLIPPING-FIX.md 整理。历史版本说明保留原记录;品牌为 PolarisUI,当前 API 包名为 polaris.sdk.ui。