【Win 10 应用开发】UI Composition 札记(七):基于表达式的动画

时间:2022-05-28 08:37:31

上一篇烂文中,老周给大伙伴们介绍过了几个对照好玩的动画。本篇咱们深化主题,说一说基于表达式的动画。这名字好理解,就是你可以用公式 / 等式来孕育产生动画的方针值。好比,你想让某个可视化东西的高度减半,你的表达可以这样写: width / 2,此中,width 暗示某东西的宽度。

既然说到基于表达式的动画了,就得介绍一个重要的类型:ExpressionAnimation,它专用来实现表达式动画的。它有一个 Expression 属性,字符串类型,用来设置计算动画方针值的等式。

有关表达式的语法,老周就不空话了,其实语法和 C 类语言差不久不多。大伙在用的时候,也不用去记的,你只要检察 ExpressionAnimation 类的文档,就能看到完整的辅佐内容了。不记得怎么写的时候检察一下辅佐文档就可以了。

注意,ExpressionAnimation 孕育产生的动画,你是不能控制当时间长度的,它会由系统来进行计算,而且这个动画很好玩,它可以跟踪参数的变革,当引用参数产生变革时,会更新动画。这类似于数据绑定的成果。

下面我们举个例子。

XAML 代码很简单。

<Grid Name="root" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Rectangle Name="rect" Fill="Green" Width="200" Height="200"/> </Grid>

页面的根元素是 Grid,然后在里面放一个矩形。

待会儿我们用动画来旋转这个矩形,怎么转呢,计算公式如下:

    Grid的宽度 ÷ Grid的高度 × 360

这个公式会得出矩形要旋转的角度(单位为度)。Grid 的宽度和高度不需要我们写代码去设置,因为默认是填充对齐的,所以,只要我们调解窗口的巨细,Grid 的巨细就会随着变。

转到代码文件,在页面类的结构函数中,输入这些代码。

public MainPage() { this.InitializeComponent(); Visual v_root = ElementCompositionPreview.GetElementVisual(root); Visual v_rect = ElementCompositionPreview.GetElementVisual(rect); var compositor = v_rect.Compositor; // 旋动弹画 ExpressionAnimation anmitRot = compositor.CreateExpressionAnimation(); anmitRot.Expression = "360 * container.Size.X / container.Size.Y"; anmitRot.SetReferenceParameter("container", v_root); v_rect.StartAnimation(nameof(Visual.RotationAngleInDegrees), anmitRot); }

请你注意看阿谁表达式:360 * container.Size.X / container.Size.Y,可能你会疑问,这个 container 是什么鬼?这个不是鬼,是我随便取的名字,你爱取其他名字都行,好比,你可以写成 360 * dog.Size.X / dog.Size.Y。这其实是个占位符,它实际上是指向代表 Grid 的可视化东西,在运行时,会用真实的东西替换失这个占位符。那么,这个参数占位符怎么替换呢?

你有没有发明,CompositionAnimation 类有一堆要领,定名很 TMD 有规律,全是一家人,都叫 Set*****Parameter,看到了没?

【Win 10 应用开发】UI Composition 札记(七):基于表达式的动画

你以前是不是不知道这些要领有毛用,此刻你应该猜它们有什么用了。对啊,就是用来设置替换占位符的实际值的。好比,我们这个示例子,它的表达式是这样的:

360 * container.Size.X / container.Size.Y

其实这个 container 就是指代码中的 v_root 东西,所以我们用这一行代码,就可以在运行阶段,用 v_root把 container 占位符替换失,酿成:

360 * v_root.Size.X / v_root.Size.Y

anmitRot.SetReferenceParameter("container", v_root);

而 v_root 就是 XAML 中的 Grid 东西,所以,这样就实现了Grid的宽度除以Grid的高度的计算了,再乘以 360 就完事了。

此刻你大白了吧,世上很多工作,别想得太庞大,其实人生中很多工作是很简单,就是人总喜欢搞庞大了。

这个表达式计算出来的功效是 float 类型的值,这个你应该能理解的,因为它计算之后就是一个数值,不成能会孕育产生一个 Vector2 值的。接着,我们把这个动画与 v_rect,注意是rect,因为我们要旋转的是矩形,不是Grid,用 StartAnimation 要领使之与 RotationAngleInDegrees 属性绑定就好了,RotationAngleInDegrees 暗示的角度,不是弧度。

v_rect.StartAnimation(nameof(Visual.RotationAngleInDegrees), anmitRot);

好,此刻这个东东已经可以运行的了,尝尝看。

【Win 10 应用开发】UI Composition 札记(七):基于表达式的动画

只要调解窗口的巨细就可以了,Grid 的巨细会自动更新。