C3.19.4Nested scroller touch ownership设计研究

嵌套滚动容器的触点归属规则

别名: 触点归属 · 滚动捕获 · scroll ownership

概念解释

两个可滚容器叠在同一触点下时,系统必须先裁定谁拥有这条触摸,然后才谈滚动。归属规则是冲突消歧的一种:在按下或首次移动时把事件交给内层、外层或两者之一,而不是在滚动中途才决定交棒。信息流里的横向卡片叠在纵向列表上,按下那一瞬间就要回答“这是卡片的平移还是列表的滚动”。

机制

常见策略有三种。内层优先:命中测试落到最深的可滚视图,它独占后续移动,直到自己失败。外层优先:父视图先认领,子视图只能在父失败后接手。协商/同时:父子都收到事件,由失败依赖决定谁成功。归属一旦在起始窗口锁死,中途改判会把已经滚过的偏移变成错账。这条关心的是“第一帧事件给谁”,不是内层顶到头之后如何把剩余位移让给外层——那是另一套运行时交棒。

怎么研究

在嵌套结构上投放纯纵向、纯横向和斜向轨迹,记录第一帧以及阈值跨越时的事件接收者。因变量:错误归属率、用户改用手势重试的次数、起始延迟。把“起始归属错误”与“边界交棒不顺”分成两类编码,混在一起会把两种机制的缺陷算成一个。

边界

单层列表没有归属问题。子视图若根本不可滚(静态横幅),命中测试不应把它当成候选所有者。指针或键盘滚动不走这套触摸归属。系统边缘手势可以在应用的归属决定之前把事件抽走。归属规则也不能拿来解释文本手柄与页面滚动的争夺,那是选区命中优先,不是容器树仲裁。

怎么落地

  • 为每个嵌套对写明起始归属:卡片轨默认内层拿水平,feed 默认外层拿垂直,斜向按主轴锁死后再交给赢家。
  • 用失败依赖而不是“谁先 setContentOffset”来锁所有者,避免两层同时滚。
  • 在真机上从卡片中央、卡片与列表的缝、以及列表空白处起手,核对第一段位移只驱动一层。

延伸

  • 同组C3.19.1 同一起始动作被多个手势竞争 · C3.19.2 按方向、速度、指数、时长分流的判别顺序 · C3.19.3 判别期内不得提交不可逆动作
  • 相邻C3.23 嵌套滚动的触点抢夺 · C3.31 系统手势与应用手势的优先级
  • 站内检索touch ownership · nested scroll · gesture capture

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C3.19.4