使用合成动画对 XAML 元素进行动画处理

本文介绍了新的属性,它们让您在享有合成动画性能的同时,轻松设置 XAML 属性,从而对 XAML UIElement 进行动画处理。

在 Windows 10 版本 1809 之前,有 2 种在 UWP 应用中生成动画的选项:

使用视觉层比使用 XAML 构造提供更好的性能。 但是,使用 ElementCompositionPreview 来获取元素的基础合成 Visual 对象,然后用合成动画对该 Visual 对象进行动画处理,使用起来会较为复杂。

从 Windows 10 版本 1809 开始,可以直接使用合成动画对 UIElement 上的属性进行动画处理,而无需获取基础合成视觉对象。

注释

若要在 UIElement 上使用这些属性,UWP 项目目标版本必须为 1809 或更高版本。 有关配置项目版本的详细信息,请参阅 版本自适应应用

例子

WinUI 2 画廊
WinUI 图库

如果已安装 WinUI 2 库 应用,请单击此处 打开应用,并在操作查看动画互操作。

新的呈现属性替换旧的呈现属性

此表显示可用于修改 UIElement 呈现的属性,这些属性还可以使用 CompositionAnimation进行动画处理。

资产 类型 DESCRIPTION
不透明度 加倍 对象的不透明度程度
翻译 Vector3 移动元素的 X/Y/Z 位置
变换矩阵 Matrix4x4 要应用于元素的转换矩阵
比例 Vector3 将元素以中心点 CenterPoint 为中心进行缩放
旋转 漂浮 围绕旋转轴和中心点旋转元素
RotationAxis Vector3 旋转轴
CenterPoint Vector3 缩放和旋转的中心点

TransformMatrix 属性值按以下顺序与 Scale、Rotation 和 Translation 属性相结合:TransformMatrix、Scale、Rotation、Translation。

这些属性不会影响元素的布局,因此修改这些属性不会导致新的 Measure/Arrange 传递。

这些属性的用途和行为与合成 Visual 类中的同名属性相同(除了 Translation 属性,它不存在于 Visual 类中)。

示例:设置 Scale 属性

此示例演示如何在 Button 上设置 Scale 属性。

<Button Scale="2,2,1" Content="I am a large button" />
var button = new Button();
button.Content = "I am a large button";
button.Scale = new Vector3(2.0f,2.0f,1.0f);

新旧属性之间的相互排他性

注释

Opacity 属性不会强制执行本节中所述的相互排他性。 无论使用 XAML 还是合成动画,都使用相同的不透明度属性。

可以使用 CompositionAnimation 进行动画处理的属性是多个现有 UIElement 属性的替换项:

设置(或设置动画)任何新属性时,不能使用旧属性。 相反,如果设置(或动画)任何旧属性,则无法使用新属性。

如果您通过这些方法使用 ElementCompositionPreview 自行获取和管理视觉对象,则无法使用新属性:

重要

尝试混合使用这两组属性将导致 API 调用失败并生成错误消息。

可以通过清除属性来从一组属性切换到另一组,但为了简化操作,不建议这样做。 如果属性由 DependencyProperty 提供支持(例如,UIElement.Projection 由 UIElement.ProjectionProperty 提供支持),则调用 ClearValue 将其还原为其“未使用”状态。 否则(例如 Scale 属性)将属性设置为其默认值。

使用 CompositionAnimation 对 UIElement 属性进行动画处理

可以使用 CompositionAnimation 对表格中列出的呈现属性进行动画处理。 这些属性也可以由 ExpressionAnimation引用。

使用 UIElement 上的 StartAnimationStopAnimation 方法对 UIElement 属性进行动画处理。

示例:使用 Vector3KeyFrameAnimation 对 Scale 属性进行动画处理

此示例演示如何对按钮的规模进行动画处理。

var compositor = Window.Current.Compositor;
var animation = compositor.CreateVector3KeyFrameAnimation();

animation.InsertKeyFrame(1.0f, new Vector3(2.0f,2.0f,1.0f));
animation.Duration = TimeSpan.FromSeconds(1);
animation.Target = "Scale";

button.StartAnimation(animation);

示例:使用 ExpressionAnimation 对 Scale 属性进行动画处理

页面有两个按钮。 第二个按钮通过缩放动画变为第一个按钮的两倍大。

<Button x:Name="sourceButton" Content="Source"/>
<Button x:Name="destinationButton" Content="Destination"/>
var compositor = Window.Current.Compositor;
var animation = compositor.CreateExpressionAnimation("sourceButton.Scale*2");
animation.SetExpressionReferenceParameter("sourceButton", sourceButton);
animation.Target = "Scale";
destinationButton.StartAnimation(animation);