禁止商用。所有使用 PolarisUI 的应用都必须公开完整源码。查看许可条款
四段三次贝塞尔圆角
API
button.radius(16, 24, 10, 18); // TL, TR, BR, BL
button.corner(Corner.TOP_LEFT, new BezierCorner(22, 0.8f));
button.corners(CornerRadii.of(16, 24, 10, 18, 0.55f));
每个 BezierCorner 包含 radius 和 smoothing。CornerRadii 是不可变对象,.with(...) 产生新的配置;.scale(...) 供绘制变换使用。一般通过 Widget 方法调用即可。默认模式全局开启:
ui.theme().cubicCorners(true).cornerSmoothing(0.55f);
cubicCorners(false) 关闭全局自动三次圆角,保留旧圆弧距离函数用于对比;显式的 Widget.corner/radius 四角配置仍表示三次曲线。
精确含义
一个圆角矩形有四条三次曲线,每角一条,外加四条直边。不是每角四条,也不是四个点连直线。
以左上角为例,把坐标变换到向控件内部为正方向的局部坐标。半径为 r,控制柄比例 k:
P0 = (0, r)
P1 = (0, r * (1 - k))
P2 = (r * (1 - k), 0)
P3 = (r, 0)
B(t) = (1-t)^3 P0 + 3(1-t)^2 t P1 + 3(1-t)t^2 P2 + t^3 P3
k = 0.55228475 + 0.44771525 * smoothing
smoothing=0 是常见的三次曲线四分之一圆近似,不是精确圆弧。smoothing=1 时曲线端点曲率为零。中间数值与直边保持相切,但不据此声称所有参数都实现曲率连续,更不声称等同于 Apple 私有 continuous corner 常数。
四角半径在 GPU 上各自限制在较短边的一半以内,因此不会跨越控件中线或互相折返。这是当前实现的范围,超出范围的半径不会增大曲线。
GPU 实现
Java 只把四角半径和控制柄传给指令缓冲。geometry.glsl 在片元中评估三次多项式:先用 9 个 t 候选确定最近区间,再执行固定 14 步黄金分割最近点细化;最后根据有向法线确定正负距离。
这是一个有界迭代的数值距离场,不是宣称有三次曲线距离的通用闭式解。普通非角部区域使用精确直边;圆形滑块和默认胶囊使用圆弧路径以保留真正的圆形。
填充、描边与玻璃高光引用同一个距离和法线,因此不会分别用不同形状去拼边。颜色和 AA 都在同一个着色过程中处理。按压、缩放变换会缩放四角半径而不更改控制柄比例。
当前自定义轮廓的命中测试仍是控件矩形范围,矩形 clip 也不自动升级为任意贝塞尔裁剪。新 API 不改变之前公开的输入模型。
验证
实际 GPU 输出与独立的单调三次多项式边界参考,在 9,372 个避开 AA 带的角部像素中一致。另检查了四角不同半径、不同控制柄、圆弧/三次差异、1x/2x 缩放以及固定画面重复渲染。测试范围是常规 UI 尺寸,不等价于任意极端浮点坐标的数学证明。