在 DirectManipulation 中使用多个视区

使用多个视区时, 命中测试通过获取联系人的屏幕位置并确定联系人命中哪个视区矩形,确定哪个视区 () 受用户输入的影响。

直接操作中的一种常见方案是将一个视区置于另一个视区中,也称为嵌套视区。 如果联系人命中多个视区,则窗口的 WndProc 调用 SetContact 的顺序将确定嵌套视区的父子关系。

规则:子元素应在调用父元素之前调用 SetContact

显示命中测试的 hierachy 的示意图

一个联系人在视区中下来。 应首先在橙色 (子) 视区上调用 SetContact,然后调用绿色 (父) 视区来建立正确的层次结构。

定位正确的视区

一个联系人可以与任意数量的视区相关联,并且每个联系人可以分配给不同的一组视区。

可以根据需要将每个视区配置为支持特定交互。

根据这些设置, 直接操作 标识哪个视区处理输入。 命中测试层次结构中最子级的视区第一次有机会处理输入。 但是,链接和父级提升都可以更改处理输入的视区。

链接

在操作期间到达内容的末尾时, 直接操作 会应用边界效果,以指示内容无法进一步操作。 但是,如果子视区 链接到 父视区,则会抑制此效果。 相反,支持操作的命中测试层次结构中最近的上级视区处理输入。 如果操作方向反转,使上级返回到触发链接的点,则操作“解链”和控件将传输回子视区。

显示链接操作的示意图

当用户将子视区一直平移到内容的边缘时,操作将“链”到父视区,然后用户开始平移父内容。

注意

X 轴和 Y 轴链彼此独立,因此,如果对角平移在 y 边界前到达 x 边界,则操作将父级向 x 方向移动,同时继续向 y 方向移动子级。 若要启用或禁用链接,请在子视区上调用 SetChaining API。

Rails

在视区配置中指定导轨会影响从视区链接输入的方式。 具体而言,输入不能在“无轨”平移模式下从有轨子视区链接到其父级。 若要在设置导轨时链接输入,用户必须垂直或水平平移并锁定到导轨。

缩放

如果子视区嵌套在父级内,并且两者都配置为缩放,则缩放操作可以从子级链接到父级。 但是,如果操作继续,则它仅适用于父级,不能“取消”到子级的链。 如果用户将缩放从子级链接到父级, 则直接操作 会暂停子级,直到从屏幕中删除与该操作关联的所有联系人为止。 此时,子视图已从挂起状态释放,用户可以平移子视区。

手势定位:父级提升

手势定位直接操作 将联系人组合在一起并确定哪个视区处理输入的过程。 父级提升 是指将输入从子级传输到父级的情况。 例如,当用户在配置为仅滚动的子视区内放下两个联系人和夹子时,输入将提升到父级,以便进行缩放。 无论是否在子视区上启用了链接,都会进行父级提升。

与链接不同,父级提升不会逆转。 父视区会继续处理交互输入,直到所有触点都提升 (子视区停止处理输入) 。