K2.08.4mixed-DPI layout rounding设计

混合分辨率环境下的字号与间距换算容易产生累积误差

别名: 分数缩放取整 · 125% 布局误差 · fractional scaling

概念解释

13 号字加 8 像素内边距、再加 1 像素描边,在 125% 或 150% 下每一层都要乘比例再取整。单看一层只偏半个像素,嵌套三层之后行高对不齐、图标和标签基线错开、本该一屏放下的工具栏折到下一行。混合分辨率下的累积误差(mixed-DPI layout rounding)指字号与间距在非整数倍缩放里一层层换算后的漂移,不是整窗被拉伸变糊,也不是图标该换 @2x。整数倍(200%)几乎不触发这件事;125%、150%、175% 才是重灾区。

机制

布局是一串整数约束:行高、间距、边框、图标槽,最终都要落到整像素上才能画。非整数比例把「乘完再取整」引进每一层。内边距 8×1.25=10,字号 13×1.25=16.25 变成 16 或 17,描边 1×1.25=1.25 变成 1 或 2。取整方向若每层独立选,偏差同向叠加:三层各 +0.5 就丢出 1.5 像素,一列二十行就是 30 像素的高度漂移,滚动区和固定头会对不齐。反向取整则在缝里出现空隙或裁切。图标按偶数槽对齐、文字按字形度量对齐,两套网格在分数缩放下不再公度。工具包若在父级乘一次、子级再乘一次,等于把比例平方,误差从「取整」变成「量纲错了」。

边界

两块屏都是 100% 或都是 200%,没有分数倍,累积取整几乎不出现。纯矢量、用物理单位排版的引擎如果在最后一次栅格才取整,中间层保持分数,漂移会小得多。用户把系统缩放和「文字再放大」叠在一起用时,等于又乘了一层,桌面应用里常见的「只适配了系统 DPI、没适配文字缩放」会把误差再放大。表格、代码编辑器这类以行高为节奏的界面,对 1 像素漂移比卡片流敏感得多。

怎么落地

  • 在根上换算一次当前屏比例,子级只做加减,禁止每个控件自己再乘一遍缩放。
  • 行高、图标槽、工具栏高度用同一套取整规则(都向下或都向最近偶数),避免图标网格和文字行各取各的。
  • 优先用整数倍作为设计和测试锚点,但验收必须包括 125% 与 150%:看行是否折、列是否齐、固定头与滚动体是否错位。
  • 验证:在 150% 下打开最深的嵌套面板(工具栏 + 标签 + 内边距卡片),用像素标尺量相邻行高是否一致,图标中心是否落在标签行的垂直中线。把窗口拖到 100% 再拖回 150%,同一组度量不应越来越偏——若每次往返都多出缝,说明换算被执行了两次。

延伸

  • 同组K2.08.1 应用需感知每个显示器独立的缩放比例而非套用系统全局值 · K2.08.2 位图资源在跨屏移动时需要按目标显示器重新加载对应分辨率 · K2.08.3 未做每显示器感知的应用会在高分屏上出现模糊或错位
  • 相邻J2.02 文本缩放 · A1.16 视角尺寸换算
  • 站内检索fractional scaling · layout rounding · mixed DPI

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/K2.08.4