直接作 使用 视区、 和 联系人 内容来描述 UI 的交互式元素。
视区 是一个可从用户交互接收和处理输入的窗口中的区域。 视区表示最终用户在给定时间(也称为内容剪辑)可以看到的内容区域。 视区具有多个函数:
- 它管理交互状态(例如,当内容准备好作时、内容正在进行作时、内容处于惯性动画中时)并将输入映射到输出转换。
- 它包含移动以响应用户交互的内容。 这可能是 HTML div 元素(滚动)、可平移列表(Windows 8 开始屏幕)或选择控件的弹出菜单。
通过调用 createViewport创建视区。 可以在单个窗口中创建多个视区,以生成丰富的 UI 体验。
Content 表示在响应交互时转换的元素。 换句话说,内容是在用户平移或平移时移动或缩放的内容。 有两种类型的内容:
- 主要内容 是视区中响应输入作和惯性的单一内部元素。 主内容与视区同时创建,不能从视区添加或删除。 可以使用贴靠点自定义主要内容的行为(稍后讨论)。
- 辅助内容 相对于主要内容的移动移动。 辅助内容独立于视区创建,可从视区添加或删除。 所有辅助内容转换都基于主要内容的转换进行计算。 可以应用特定规则来更改转换的计算方式,具体取决于元素的预期用途,在创建期间由其 CLSID 标识。
在此图中,显示平移前后的单个联系人已用于平移主要内容。 即使用户没有直接与平移指示器(辅助内容)交互,辅助内容也会随着主要内容平移而移动。 这为用户平移的距离提供了视觉提示。
显示平移前后的
配置视区
创建视区后。 使用 交互配置配置配置其行为。 交互配置指定支持哪些作(如平移)。
平移 更改内容沿水平轴或纵坐标轴或同时作为用户平移的位置。 在两个轴上配置翻译时,内容将任意方向自由移动。
若要限制内容运动,请配置 导轨,通常位于水平轴和垂直轴上。 如果用户的交互主要沿单个轴(下一个图表中的蓝色区域表示),则平移将变为 条形,内容仅沿带轨轴移动。 如果用户已平移,并且当前处于轨道,并在内容处于惯性状态时执行第二个平移,则新平移将继续受到栏杆。
示例:为横向和垂直平移配置视区。 在第一帧中,联系人关闭。 第二种是启动垂直平移,接触锁定在垂直轨道上。 最后,一旦平移被围栏,只有对角盘的垂直部分用于移动内容。
如果用户以不在铁轨检测区域(白色区域)的方式对角平移,则平移 无轨,内容将在两个轴上自由移动。
显示在未脱轨的平移关系图
缩放 当用户英寸或拉伸时更改内容的规模因子。 内容缩放的点(称为缩放中心)位于联系人的中心。 如果已设置水平或垂直对齐方式,缩放中心将更改以保留对齐方式。
显示具有指定对齐方式的内容缩放关系图
可以通过指定解锁中心来替代此行为,该中心设置联系人中心中心的缩放中心。
显示缩放中心已解锁关系图
惯性 是作的逐渐减速,无论是平移和缩放,都是在所有联系人被抬起(在触摸的情况下)或键盘/鼠标输入之后(如单击滚动条或按箭头键)。 当用户作内容时,作不会在解除联系人后立即停止。 相反,内容在当前方向和速度上继续,逐渐减慢到停止。
对齐点和边界
由于手指从屏幕(触摸的情况下)或键盘/鼠标作(如箭头键、页面向上/向下、鼠标滚轮滚动等)导致作结束,惯性动画将发生。
有两个定义惯性动画的信息:
- 动画的其余点 – 特定转换组件的最终结束位置。
- 动画持续时间、曲线、速度 - 这些由休息点的类型确定。
惯性动画受贴靠点和边界的影响。 边界指定内容的最大和最小休息点。 如果内容在惯性期间到达边界,将应用边界动画。 对齐点在主要内容上定义,以修改其余点并修改惯性动画曲线本身。
在内容不均匀间距时,使用 SetSnapInterval 定义对齐点 SetSnapPoints。 下面是对齐点的示例:
显示内容中设置对齐点如何影响平移关系图
在关系图中,有一段内容包含一系列子内容块 - 新闻阅读器类型应用中的新闻项或网格视图中的项目。 目的是在惯性结束后将项的左边缘贴靠在视区左边缘。
有两组对齐点类型:
- 可选与强制:可选的对齐点仅在惯性休息点靠近对齐点时,才会捕捉惯性动画。 强制对齐点始终将惯性动画捕捉到指定的对齐点。
- 单个与多个:多个对齐点类型允许内容在靠近其自然休息点的对齐点前移动多个对齐点。 单个对齐点类型选择下一个最近的对齐点作为惯性动画的余点。
下图演示了对齐点类型如何修改惯性动画的其余位置。
显示惯性和对齐点如何与关系图
在此图中,惯性起点被标记为“开始”,在缺少对齐点的情况下自然惯性结束位置标记为“结束”。 垂直线标记各种对齐点。 下表描述了每种类型的对齐点将如何影响动画的结束位置。
点类型 | 描述 |
---|---|
必需单一 | 选择对齐点 P1,因为它是惯性方向的第一个对齐点 |
必需倍数 | 选择对齐点 P2,因为它最接近惯性方向的终点 |
可选单一 | 选择对齐点 P1,因为它是惯性过程中遇到的第一个对齐点 |
可选多个 | 选择对齐点 P2,因为它靠近自然终点 |
对齐点偏移和 RTL 方案
显示 rtl 对齐点使用关系图
使用 SetSnapCoordinate API 应用贴靠点偏移量和坐标系 , 该 API 使用指定的偏移量/坐标系偏移所有对齐点或对齐间隔。
在 RTL 方案中,坐标系非常有用,你希望在反向方向描述内容左边缘的对齐点。 在上图中,SetSnapCoordinate 与 DIRECTMANIPULATION_MOTION_TRANSLATEX 和 DIRECTMANIPULATION_COORDINATE_MIRRORED 标志一起使用,该标志会自动从内容的左边缘偏移对齐点,并按从右到左的顺序提供它们:S1 为 0px,S2 为 50px(依如此)。 使用 SetSnapCoordinate 的任何偏移集都会自动从内容的左边缘进一步偏移,包括正确的比例系数。
几乎始终使用 SetSnapCoordinate,源 参数集以避免在内容区域之外设置对齐点。
例如,如果视区为 200x200,并且内容为 1000x200,并且接口为 RTL,则视区在首次显示视区时,其左边缘为 x=800。 使用 SetSnapCoordinate(DIRECTMANIPULATION_MOTION_TRANSLATEX, DIRECTMANIPULATION_COORDINATE_MIRRORED, 1000.0)
调用 SetSnapCoordinate,以指定应从内容右边缘开始从右到左的顺序计算对齐点。
行为
行为 是一个对象,可以附加到视区,以修改 直接作 如何处理视区的主要内容或辅助内容的输出转换。 行为对象可能会影响作的一个或多个方面,例如处理输入的方式或惯性动画的应用方式。 例如,自动滚动行为通过在主要内容的一端执行滚动动画来影响惯性动画。 跨幻灯片配置行为会影响直接作输入处理,用于检测何时执行跨幻灯片作。
通过调用 CreateBehavior来创建行为对象,并将其添加到视区,然后以异步方式配置其行为。 从视区中删除行为会删除其效果。
坐标系
直接作采用三个主要坐标系:
- 客户端坐标系 - 描述客户端窗口的矩形。 单位以像素为单位。
- 视区坐标系 - 描述客户端中可以处理输入的区域矩形。 单元是应用程序定义的(使用 SetViewportRect)。
- 内容坐标系 - 描述主要内容的矩形或大小。 单元是应用程序定义的(使用 SetContentRect)。
对于这三个系统,坐标是相对于其各自的左上原点定义的,并且正向右和向下增加。 下图说明了这些坐标系。 最终用户只能查看或作视区矩形中内容的节。
显示内容、客户端和视区坐标如何与关系图
变换
直接作 维护多个不同的转换,这些转换有助于整体显示的输出。
- 内容转换 – 基于作或惯性 直接作 计算的初始转换。 它捕获贴靠点、栏杆、默认超跨度(作)、默认过度旋转(惯性)和 ZoomToRect 动画的效果。
- 输出转换 - 最终视觉对象或输出转换。 它是内容以及同步转换的组合。
- 同步转换 - 在调用 syncContentTransform时计算。 它有助于 直接作 应用应用程序提供的新内容转换,同时维护现有的输出转换。
- 显示转换 - 由应用程序应用作为后期处理的一部分。 有关详细信息,请参阅 SyncDisplayTransform。
由于输出转换旨在在屏幕上直观地偏移图面,因此 直接作 对输出转换组件执行必要的舍入,以便始终在整型像素边界呈现/复合文本和其他内容。 舍入机制取决于多种因素,包括运动的速度和远程桌面的存在。 辅助内容的舍入机制与主要内容的舍入机制匹配,同时考虑到两者之间运动的差异。 GetOutputTransform 的客户端不应依赖于输出转换的精确舍入机制,因为各种因素会影响它。
注意
这意味着内容转换的组件可能不是整型的,并且可能包含子像素偏移量。 鼓励使用 直接作 的客户端使用 getOutputTransform,以在使用手动更新模式时计算要应用于内容的正确视觉转换。 使用内置合成器使用自动更新模式时,直接作会自动代表客户端应用此转换。 此转换由直接作生成,以确保在撰写视觉输出时直观地呈现结果。
视区状态
处理输入时,视区管理输入到输出转换的交互状态和映射。 通过调用 GetStatus来检查视区交互状态。
显示直接管理交互状态关系图
生成 – 正在创建视区,并且尚无法处理输入。 若要处理输入,请调用 IDirectManipulationViewport::Enable。 如果未调用 启用,视区将转到“已禁用”状态。
注意
这是交互的初始状态。
已启用 – 视区已准备好处理输入。 当联系人关闭(调用 SetContact)并检测到作时,视区将转换为“正在运行”。
正在运行 – 视区当前正在处理输入和更新内容。 当联系人提升时,视区会转换为惯性(如果已配置)。
惯性 – 内容在惯性动画中移动。 惯性完成后,视区将转换为“就绪”。 如果在视区上设置了自动禁用,它将从惯性过渡到就绪,然后转换为禁用。
就绪 – 视区已准备好处理输入。 当联系人关闭(调用 SetContact)并检测到作时,视区将转换为“正在运行”。
已挂起 – 视区在 SetContact 链中将其输入提升为父级时,视区可能会变为“挂起”。 多个视区中更详细地讨论了这一点:命中测试和视区层次结构。
已禁用 – 视区不会处理输入或进行回调。 可以通过调用 IDirectManipulationViewport::D isable来禁用视区。 如果在视区上设置了自动禁用,则会在处理作后自动转换为“已禁用”。 若要重新启用禁用的视区,请调用 IDirectManipulationViewport::Enable。
相关主题
多个视区:命中测试和视区层次结构、ActivateConfiguration、GetOutputTransform、SyncDisplayTransform