在 DirectManipulation 中使用多个视区

使用多个视区时,命中测试通过获取触点的屏幕位置并确定该触点命中的视区矩形,以判断哪些视区受到用户输入的影响。

直接操作中的常见情况是将一个视区放置在另一个视区内,也称为嵌套视区。 如果接触点命中多个视口,窗口WndProc调用SetContact的顺序决定了嵌套视口的父子关系。

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

显示命中测试的层次结构的关系图

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

以正确的视区为目标

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

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

根据这些设置, Direct Manipulation 标识哪些视区处理输入。 命中测试层次结构中的子级视区具有处理输入的第一个机会。 然而,链式处理和父节点提升都可以改变哪个视区处理输入。

链接

在操作过程中到达内容末尾时,直接操作将应用边界效果,表明内容无法进一步。 但是,如果子视区 链接到 父视区,则会取消此效果。 相反,在命中测试层次结构中,支持操作的最近的上级视口会处理输入。 如果操作的方向被反转,以便父级返回到触发链接的位置,则操作将“取消链接”,并将控制权移回子视图。

链式操作显示图

当用户将子视区平移到内容的边缘时,操作会“切换”到父视区,用户接着开始平移父内容。

注释

X轴和Y轴彼此独立地运动,因此,如果对角滑动在到达y边界之前碰到了x边界,操作会将父元素向x方向移动,而子元素则继续向y方向移动。 若要启用或禁用链式调用,请在子视口上调用 SetChaining API。

Rails

在视口配置中指定轨道会影响从视口传输输入的方式。 具体而言,在轨道的“无轨”平移模式下,输入无法从带轨的子视口链接到其父视口。 若要链接输入,用户在导轨设置好时,必须进行垂直或水平平移,并锁定在导轨上。

缩放

如果子视区嵌套在父级内,并且两者都配置为缩放,则缩放操作可以从子级传递到父级。 但是,如果继续进行操作,它仅适用于父级,并且无法“解除链接”子级。 如果用户将缩放从子级链接到父级,在直接操作中会暂停子级,直到从屏幕中删除与该操作相关的所有接触点。 此时,子对象将解除挂起状态,用户可以平移子视图。

手势目标:父级提升

手势目标直接操作 将联系人组合在一起并确定哪些视图处理输入的过程。 父提升 是指将输入从子级转移到父级的情况。 例如,当用户在仅配置为滚动的子视区中放下两个接触点并进行捏合时,输入会传递到父视区以便进行缩放。 父视区提升的出现不受子视区是否启用级联影响。

与链接操作不同,父节点升级不会逆转。 父视区继续处理交互输入,直到解除所有联系人(子视区停止处理输入)。