黑白材质与连续拖动(2.2 引入,2.4 保留)
本次修改的实际原因
2.1 的普通控件统一采用 radius=16,小按钮接近胶囊;滑块在 pressed 时直接绘制数值位置,跳过了 motion 分支,松手再用滞后的弹簧状态,因此两种轨迹可能不衔接。默认 step=1 也把指针取值量化为整数。
旧高光使用 exp(-abs(d+1.2)*1.15/1.2),峰值在轮廓内侧。旧的倒角可达 26 逻辑单位,会占据小控件的大部分面积;亮色逐项相加后限制到 1,容易显得刺眼。蓝色来自 Theme 的 accent / surface 以及默认背景,不能只靠调整 tint 强度去除。
圆角与光学
Theme.radius=9 用于普通按钮和输入类控件,Theme.panelRadius=18 用于大面板,菜单和数据行也使用对应较小的半径。明确的圆形/胶囊控件仍使用圆形/胶囊 SDF。2.4 的普通四角已改用可配置三次贝塞尔距离函数,详见 BEZIER-CORNERS.md;没有声称使用 Apple 的私有曲线。
shader 用同一 SDF 描述可见覆盖率与边缘反射,反射峰值对齐 d=0,不再额外内移。以解析法线配合 fwidth(pui) 计算像素覆盖宽度,避免移动到不同像素块时圆角的有限差分宽度漂移。像素检查中,控件和指针同时平移后,测试图对应像素完全一致;2x 缩放后高光仍位于同一物理轮廓。
灯光方向改为有稳定 Z 分量的三维方向,指针只作温和调制。它不会在指针经过某个二维零向量位置时突然翻转。2.4.3 将曾被压低的默认值改为 shine=.82、dispersion=.85:高光仍通过有界混合形成轮廓反射,浅色材质增加相反方向的环境反射。色散改为清晰背景的局部色度差,不再采样被强模糊抹平的颜色。不会增加选中描边;细节见 高光与色散修复。
refraction=10,位移集中在有限的边缘倒角内,不再对整块背景施加中心缩放偏移。若宿主背景本身有色彩,折射仍然保留背景色彩;只是材质 tint 和默认演示配色为中性黑白。
模糊
默认 sigma 18 是物理 framebuffer 像素,默认 mix .98 是清晰/模糊采样的混合值,二者不同。输出 alpha=1 避免在完成模糊后又通过 alpha 合成漏进 6% 清晰背景;控件禁用/淡出仍可按需要改变其透明度。
两遍 GPU 高斯管线和共享背景纹理保留。实际棋盘测试中,同一输入的相邻像素差由旧配置的 11.2 降至新配置的 0.8;这是特定测试图的结果,不是所有背景的保证。清晰预设仍会故意降低 mix,文字和图标不属于随后模糊的输入。
连续拖动
Slider 指针输入默认连续。显式 .step(n) 恢复离散步进,.continuous() 再次关闭指针量化;键盘默认仍按 1 个数值单位调整。
逻辑数值在输入事件到达时更新。绘制位置使用 MotionValue.follow() 指数跟随,响应参数 70,即约 14 毫秒的时间常数。此参数不是帧率承诺;实际呈现受渲染帧率影响。拖动与松手使用同一条无过冲轨迹,避免松手反跳。按钮和开关仍保留各自原来的弹簧动画。
整条轨道可以定位;抓住手柄时保存实际抓取偏移,不会把手柄中心突然吸到鼠标。控件捕获鼠标后,移出其边界仍继续更新,最终钳制至精确的 min / max。失去输入会取消拖动。
RangeSlider 除了两端,还允许拖动选中中段,保持区间长度;两端不能交叉。ScrollBar 两种方向使用相同的绝对行程算法,不再让水平版本走普通滑块的错误映射。
Widget.smoothPosition(true) 平滑跟随位置目标;渲染和命中使用同一套显示位置。beginPositionDrag() 从当前显示位置接管已有运动。DragBar 自动启用这种跟随。Panel.draggable(true) 可选择让整块空白/普通标签区域拖动,交互子控件仍接收自己的事件。
SplitPane 支持完整 0..1 比例,分割条和两侧子布局共享连续显示位置,边界不会生成负尺寸。ScrollPane 的滚动手柄也使用捕获偏移和连续跟随。
保留的动画与限制
按压回弹、短点击反馈、选中 tint、开关、标签页、列表选择、平滑滚动、折叠、页面进入、弹出层进退、通知及 Tooltip 动画继续保留。Theme.reducedMotion 或 --reduce-motion 会跳过这些可选过渡;--no-animation 仅冻结背景。
此版本不是完整物理光学模拟,也不提供跨所有显卡的帧率保证。2.4 已加入单通道 SDF 字体路径,详见 FONTS.md。Java 计算少量动画/布局标量,SDF、高光、折射与背景像素模糊仍在 GLSL 中进行。字体使用系统字体缓存,没有随包分发字体文件。
重复检查
sh tests/run-neutral.sh 执行连续拖动与主题/半径逻辑检查。
sh tests/run-neutral-gpu.sh 执行真实 OpenGL 的轮廓位置、亮度上限、灰阶、像素稳定和模糊检查。
sh tests/run-neutral-window.sh 用真实窗口和桌面鼠标测试整轨滑动、整段范围拖动与整块面板拖动,并输出截图序列。GIF 来自这个序列;截图有开销,GIF 播放速度不代表硬件帧率。