C3.33.3Continuous gestures are not undo units设计研究
惯性滚动等连续手势本身不是可撤销的操作单元,无需撤销语义
别名: 连续操纵 · 非命令手势 · pan not undoable
概念解释
平移、惯性滚动、捏合、画布旋转改变的是视口或笔画的连续状态,不是一条该进撤销栈的命令。用户不期望“撤销刚才那次滚动”回到三屏之前;他们再滚回去即可。给连续操纵做撤销,会把栈淹没,真正的归档/删除反而被挤掉。
机制
命令有明确的提交边界:一次轻扫归档、一次点按发送。连续操纵的边界是任意的——每帧偏移都能成一条“命令”,撤销粒度无法定义。惯性滚动的停止位置本就不可精确预测,更没有一个用户认可的“上一步”。反向滚动、反向捏合就是其补偿,属于控制本身,不是账本。把视口变化推进撤销,还会与文本编辑的撤销抢槽,摇一摇变成“撤销滚动”的笑话。
怎么研究
问用户在长列表惯性滑停后“撤销”该做什么,记录期望(回到起滑点 / 撤销上一条编辑 / 不理解问题)。观察若把每次滚动推进栈,真正编辑撤销的可达性如何下降。这是期望调查加栈污染测量,不必虚构连续操纵的“撤销率”。
边界
“滚动到某书签 / 恢复阅读位置”是显式命令,可以进栈,但它由按钮或退出页面触发,不是惯性本身。绘图里一笔一划若被定义为笔画命令,抬手可以进栈——那是把连续输入切成了命令单元。缩放若被做成“恢复默认倍率”按钮,也是命令。连续手势无撤销,不表示误翻页的分页轻扫无撤销。
怎么落地
- 不要把
contentOffset或缩放倍数的每一次变化推进撤销栈。 - 为视口提供跟手补偿(再滚、双击还原倍率),而不是撤销按钮。
- 在含编辑的文档里摇一摇或点撤销:应撤销键入或删除,而不是刚才的滚动。