Windows 动画概述

本概述介绍 Windows 动画管理器,重点介绍关键组件和概念。 有关情节提要和过渡的详细信息,请参阅 情节提要概述

本主题包含以下各节:

基本概念

动画 是连续静止图像的序列,播放时会产生运动的错觉。 在其用户界面中使用交互式动画可以为应用程序提供独特的个性,并改善用户体验。 动画有助于传达用户界面中的主要状态更改,并有助于管理用户界面的复杂性。 动画还可以增加用户对应用程序质量的感知。

例如,任务栏中使用 Windows 动画来帮助你管理和访问文件和程序,放大镜用于放大屏幕的不同部分,使用户更易于查看。

动画的基本单位是要进行动画处理的视觉元素的特征,以及该特征随时间变化的描述。 应用程序可以对各种特征(例如位置、颜色、大小、旋转、对比度和不透明度)进行动画处理。

在 Windows 动画中, 动画变量 表示要进行动画处理的特征。 切换描述动画发生时该动画变量的值如何变化。 例如,视觉元素可能具有指定其不透明度的动画变量,而用户操作可能会生成一个转换,该转换会将该不透明度从值 50 转换为 100,表示动画从半透明到完全不透明。

情节提要是一段时间内应用于一个或多个动画变量的一组过渡。 应用程序通过构造和播放情节提要来显示动画,然后随着动画变量的值随时间的变化绘制离散帧序列。

Windows 动画的组件

Windows 动画包含以下组件:

动画管理器

应用程序使用动画管理器对象来创建动画变量和情节提要、计划和控制动画,以及更新状态信息,然后应用程序绘制每个帧。 单个动画管理器对象通常跨应用程序管理所有动画,因此对所有计划的情节提要具有全局控制。

动画变量

在启动任何动画之前,应用程序需要创建动画变量对象。 动画变量表示要进行动画处理的视觉元素的一个方面。 变量是标量浮点值,但该值可以舍入为整数值。

动画变量的生存期通常与它要进行动画处理的视觉元素相同。 动画变量的初始值是在创建变量时指定的。 此后,无法直接更改其值:它必须通过动画管理器进行更新。

动画变量可以通过 标记进行标识,标记是整数标识符与指向 COM 对象的指针的配对。 标记不需要是唯一的,除非应用程序使用它来搜索变量。 默认情况下,动画变量没有标记,在设置标记之前,任何读取其标记的尝试都将失败。

计时系统

Windows 动画包括一个计时系统,可帮助确保动画以流畅且一致的帧速率呈现,同时减少系统资源在系统繁忙时用于渲染的使用。 计时器通过自动指示一小个时间单位(称为时钟周期)的通过,从而帮助管理动画呈现。 计时系统监视整体系统渲染性能,并通过动态增加或减少时钟周期的频率来 限制 动画。 应用程序可以让计时器驱动动画管理器,并可以注册处理程序,以便在每次计时周期更新管理器之前和之后收到通知。 应用程序可以为计时器指定可接受的最小动画帧速率,并在动画的实际帧速率低于此速率时收到通知。

为了节省系统资源,可以将计时器配置为在没有发生动画时禁用自身。

Windows 动画 API

Windows 动画 API 是基于 COM 的单线程 API,它为开发人员提供以下功能:

有关完整的 API 参考,请参阅 Windows 动画参考。 有关示例代码,请参阅 Windows 动画任务Windows 动画示例

配置

在计划新动画之前,应用程序必须获取当前时间。 以下是 Windows 动画支持的计时机制:

Application-Driven动画

使用硬件加速图形 API 的应用程序可以与监视器刷新率同步,以呈现流畅的动画。 或者,应用程序可以使用其自身的计时机制来确定何时绘制动画的每一帧。 在任一情况下,应用程序都会告知动画管理器何时更新其状态。 动画计时器仍可用于以动画管理器所需的单位以高精度确定当前时间。

下图显示了应用程序直接驱动动画更新时应用程序与 Windows 动画组件之间的交互。

显示应用程序直接驱动动画更新时应用程序与 Windows 动画组件之间的交互的关系图。

在最简单的配置中,应用程序会在每次刷新屏幕时重新绘制所有内容,即使没有播放动画也是如此。 为了避免浪费工作,应用程序可以注册管理器事件处理程序,以便在有计划的动画时收到通知,并且可以检测计划何时为空,以便可以停止重绘。

Timer-Driven动画

应用程序可能让动画计时器告诉动画管理器何时更新其状态,而只是在每次更新时收到通知,而不是直接更新动画管理器。 对于较旧的图形 API,建议使用此方法。 通常,如果可以与监视器刷新率同步,最好这样做并使用应用程序驱动的动画。

下图显示了当动画计时器驱动动画更新时应用程序与 Windows 动画组件之间的交互。

显示当动画计时器驱动动画更新时应用程序与 Windows 动画组件之间的交互的关系图。

计时器可以配置为仅在计划动画时运行;这样做只是在计时器和动画管理器连接时传递特定参数的简单问题。

高级功能

除了支持动画的基本基础之外,Windows 动画还支持多种高级动画技术,包括:

上下文相关持续时间

转换的持续时间不需要固定;它可以根据转换开始时动画变量的值和速度来确定。

速度匹配

如果移动物体的位置和速度不会在值之间瞬间跳跃,则移动通常更令人赏心悦目。 当新的情节提要中断当前正在播放的情节提要时,速度匹配使新情节提要能够顺利地从上一个情节提要结束的位置开始。

争用管理

如果两个情节提要需要同时更新相同的动画变量,则会发生计划冲突。 Windows 动画使应用程序能够确定任何两个情节提要的相对优先级,而无需为每个情节提要指定特定的数字优先级。

争用管理

开发人员可以实现 优先级比较 回调,以比较正在计划的情节提要和已在计划中的情节提要的优先级。 实现优先级比较的应用程序可以使用任何首选逻辑来确定情节提要何时抢占另一个情节提要。 若要解决计划冲突,Windows 动画会询问应用程序可以按以下顺序执行哪些操作:

  • 取消计划的情节提要。 如果计划的情节提要尚未开始播放,它可能会被取消并立即从计划中删除。
  • 剪裁计划的情节提要。 当新的情节提要剪裁计划的情节提要时,一旦新的情节提要开始对其进行动画处理,计划情节提要就会停止影响变量。 速度匹配,使新的情节提要能够顺利地从上一个情节提要中断的位置开始。
  • 结束计划的情节提要。 仅当情节提要包含无限期重复的循环时,才能结束情节提要。 如果情节提要在结束时处于此类循环中,则当前重复完成,情节提要的其余部分将播放。 如果在情节提要结束时循环尚未开始,则完全跳过循环。
  • 压缩计划的情节提要。 如果剪裁或取消计划的情节提要不是一个选项,则允许情节提要完成。 Windows 动画引入了压缩计划情节提要 (和在) 之前计划的任何情节提要的可用时间的可能性,以便变量更快地达到其最终状态。 应用压缩时,受影响的情节提要的时间会暂时加快,因此它们播放速度更快。

如果已注册的优先级比较对象不允许上述任何操作,则计划新情节提要的尝试将失败。 默认情况下,可以剪裁、结束或压缩所有情节提要以防止失败,但不能取消任何情节提要。

下图显示了使用UI_ANIMATION_STORYBOARD_STATUS枚举定义的状态的情节提 的生命周期。 应用程序使用 Windows 动画 API 生成情节提要并提交它进行计划。 动画管理器计划情节提要并管理动画。

显示动画管理器如何计划情节提要和管理动画的示意图。

有关情节提要计划和管理的详细信息,请参阅 情节提要概述

Windows 动画参考

Windows 动画示例

Windows 动画任务