Developer handoff · Interaction spec
倍速切换 / 精细调整控件
左侧固定为最终交互基准;右侧文档独立滚动。实现时使用同一份倍率状态连续驱动数字、刻度位置、刻度高度和两端遮罩。
01 · 状态与手势
以下几何参数均按 Android dp / iOS pt 落地,不是物理 px;时长单位为 ms,cubic-bezier 无单位。左侧预览使用 375pt × 812pt 设计基准,Android 页面宽度仍跟随实际容器。
- 单击切档
0.5 → 1.0 → 1.5 → 2.0 → 2.5 → 3.0 循环。 - 长按展开
按住 300ms 展开;松手保持,点击控件外收起。 - 拖动微调
展开后左右拖动,每 6dp / 6pt 对应 0.1X,范围限制为 0.5–3.0X。 - 数字换位
只替换变化字符;相同字符与 X 不动。旧值离场与新值进场同时执行。
02 · 动画参数
- 胶囊展开 / 收起
350ms cubic-bezier(.46, .16, 0, 1)- 刻度区淡入 / 淡出
200ms cubic-bezier(.46, .16, 0, 1)- 刻度区位移
12dp / 12pt → 0 · 260ms cubic-bezier(.22, 1, .36, 1)- 数字公共参数
200ms cubic-bezier(.46, 0, .52, .96)
新旧字符同一时刻开始;只处理发生变化的字符- 旧数字离场
opacity 1 → 0blur 0 → 2dp / 2pt
沿离场方向位移 2dp / 2pt;结束后移除旧字符实例- 新数字进场
opacity 0 → 1blur 2dp / 2pt → 0
从相反方向偏移 2dp / 2pt,回到原位- 数字切换方向
- 倍率增大:旧值向上,新值从下进入
倍率减小:旧值向下,新值从上进入 - 静止字符
- 同位置字符内容相同时不创建动画;
X始终不参与切换 - 刻度位置 / 高度
140ms cubic-bezier(.22, 1, .36, 1)
拖动中关闭 transition
03 · 刻度与边界
- 刻度
- 26 根;线宽 2dp / 2pt,间距 4dp / 4pt,节距 6dp / 6pt
- 高度序列
24 / 17 / 15 / 12dp24 / 17 / 15 / 12pt,按距激活位的距离连续插值- 激活条边界
- 视窗内
x = 10–118dp / 10–118pt,始终完整可见 - 端点遮罩
- 左右独立;距端点 0.3X 内连续减弱,到端点对应侧透明度为 0
0.5X 时取消左侧渐隐、保留右侧;3.0X 时取消右侧渐隐、保留左侧。中间状态两侧都渐隐。
04 · 核心计算
Android: dragDistanceDp = eventDeltaPx / density iOS: dragDistancePt = gesture.translation.width dragDistance = dragDistanceDp / dragDistancePt rawValue = clamp(startValue + dragDistance / 6 × 0.1, 0.5, 3.0) activeIndex = (rawValue - 0.5) / 0.1 progress = (rawValue - 0.5) / 2.5 activeX = lerp(10, 118, progress) ticksX = activeX - activeIndex × 6 leftEdgeAlpha = max(0, 1 - (rawValue - 0.5) / 0.3) rightEdgeAlpha = max(0, 1 - (3.0 - rawValue) / 0.3)