动画 (DirectComposition)

备注

对于 Windows 10 上的应用,我们建议使用 Windows 的 api,而不是 DirectComposition。 有关详细信息,请参阅 使用视觉层实现桌面应用的现代化

本主题讨论 Microsoft DirectComposition 动画的基本知识。 本节包含以下主题:

什么是动画?

动画 是一种视觉效果,通过在每次更改后重绘视觉对象,快速在一段时间内对视觉对象进行增量更改。 因为重绘发生了快速变化,因此,大脑会将增量变化视为一个不断变化的场景,就像在电影或实时操作视频中一样。

下表介绍了使用动画的一些典型方法。

动画 说明
滚动 使用动画将物理仿真动力等功能添加到滚动列表控件。
场景过渡 使用动画创建在工作流中的任务之间提供连续性的导航场景转换。 导航场景过渡提供显示用户的位置、用户在何处以及下一步需要转到的位置的上下文。
跨窗口交互 以一种方式对不同应用程序的 UI 元素进行动画处理,以使它们之间的无缝连续性,帮助用户完成涉及从一个应用程序切换到另一个应用程序的任务。

可以进行动画处理的属性

在 DirectComposition 中,通过将动画应用于定义视觉对象的对象的各个属性,对视觉对象进行动画处理。 例如,若要在屏幕上水平移动视觉对象,可将动画应用于视觉对象的 OffsetX 属性。 同样,如果您想要对视觉对象执行简单的动画2D 旋转,请将动画应用于2D 转换对象的 Angle 属性,然后将2D 转换对象应用于视觉对象的转换属性。

DirectComposition 使你能够将动画应用到任何采用标量值的对象属性。 可以将同时动画应用到多个属性和多个对象。

DirectComposition 在单独的线程上运行动画。 您可以启动动画或动画集,然后在应用程序线程上执行其他工作,甚至使线程进入休眠状态,同时组合引擎以适当的帧速率运行动画。

动画函数

DirectComposition 基于您定义的动画函数对对象属性进行动画处理。 动画函数 是一个构造,用于指定对象属性的值在一段时间内的变化方式。 例如,你可以定义一个动画函数,该函数将属性的值从1更改为360(在4秒内)。 然后,如果您将动画函数应用于2D 旋转变换对象的 Angle 属性,然后将 "转换对象" 应用于视觉对象的 "转换" 属性,则动画函数会在4秒钟的时间内将视觉对象旋转一个完整的圆。

动画函数由通过调用 IDCompositionDevice:: CreateAnimation方法创建的 动画对象 表示。 您可以通过使用动画对象的 IDCompositionAnimation 接口的方法来创建动画函数,以便将 动画段 一次追加到定义动画函数的数组。 追加段时,可以指定一个从零开始的偏移量,该偏移量标记段的开始时间(相对于动画函数的开头)。 必须按照开始时间的递增顺序追加动画段。 尝试追加一个动画段,其开始时间早于或等于前一段就会失败。 动画函数可以具有指定的结束时间,指示函数应结束的时间。

除非另外指定,否则当桌面窗口管理器 (DWM) 收到执行动画的命令时,将启动动画函数。 每个段都将运行,直到到达下一个段的开始时间。 在段间的动画属性值中发生的任何不连续的更改都被视为离散更改。

通过将属性值设置为表示动画函数的动画对象的 IDCompositionAnimation 指针,可将动画函数应用到属性。 同一动画对象可以应用于同一个对象的多个属性,还可以应用于同一设备创建的其他对象的属性。

动画段

动画段是动画函数的基本计时定义;它们是生成更复杂和更高级别的动画函数的基元。 动画段是从描述函数的一系列参数和相对于动画函数开头的时间段的开始时间构造的。 对于每个段,时间 (t) 沿水平轴前进并从 t = 0 开始。

三段

三次段的计时由三个多项式定义。 对于给定的时间输入 (t) ,输出值由以下公式指定:

x (t ) = ³+ bt² + ct + d

下图显示了包含两个三个段的动画函数。 第一个段在4秒内将值从0转换到16,第二个段在接下来的4秒内将值从16更改为0。 第一次转换沿此三次多项式发生:

x (t) = t³-6 t² + 12 t

并发生第二次转换,如下所示:

x (t) =-4 t + 16

具有两个三个段的动画函数的关系图

使用 IDCompositionAnimation:: AddCubic 方法向动画函数添加三段。

正弦段

正弦段的时间由以下公式定义:

x (t) =偏量 + * sin sin (t * Frequency * 2 * PI + 相位 * PI/180.0)

使用 IDCompositionAnimation:: AddSinusoidal 方法将正弦段添加到动画函数。

重复段

重复段重复前面指定的动画函数部分。 重复段将导致动画函数的指定部分无限循环,直到遇到下一段或达到动画的指定末尾。 动画前面的部分由其他段组成,其中包括其他重复段。 重复段不能用作动画函数中的第一段。

下图显示了一个动画函数,该函数包含两个三个三秒的三个片段,每三个时间段持续12秒。 重复段在动画中开始8秒,并重复两次前6秒的动画,直到到达结束段20秒。

包含两个三段和一个重复段的动画函数的关系图

若要向动画函数添加重复段,请使用 IDCompositionAnimation:: AddRepeat 方法。

结束段

在从段构建动画函数后,可以追加一个结束段,使动画函数在特定时间结束。 如果不追加结束段,动画函数的最后一段会无限期运行。

您可以通过调用 IDCompositionAnimation:: end 方法追加一个结束段,指定与动画函数开头之间的偏移量,该偏移量指示函数的终结点。 偏移量必须大于前面段的开始偏移量。 此外,不能将结尾段用作动画函数中的第一个基元。

调用 End时,还应为正在进行动画处理的属性指定最终值。 当到达动画函数的终结点时,属性设置为指定的最终值。

追加结尾段后,不能将任何其他段附加到动画函数。 也就是说,对动画对象的所有方法调用都将失败, IDCompositionAnimation:: Reset除外。 调用 Reset 会将动画对象返回到 clean 状态,在此状态下,动画函数不包含任何段,此时您可以再次添加线段。

与 Windows 动画管理器的兼容性

Windows动画管理器 (Windows 动画) 输出的动画基元格式与 DirectComposition API 兼容。 这意味着 DirectComposition 可以基于 Windows 动画创建的动画基元创建动画。

有关详细信息,请参阅 Windows 动画管理器IUIAnimationVariable2:: GetCurve方法和 通过 Windows 动画管理器 v2 管理 DirectComposition 动画

DirectComposition 概念