如何在 XAML 中为 WinRT 中的贝塞尔路径设置动画

Posted

技术标签:

【中文标题】如何在 XAML 中为 WinRT 中的贝塞尔路径设置动画【英文标题】:How to animate bezier path in WinRT in XAML 【发布时间】:2013-09-23 12:40:31 【问题描述】:

我是 WinRT 和 XAML 的新手,对动画的经验甚至更少。在研究了这个主题后,我注意到我可以在遍历动画时更改情节提要目标对象上的一些单独属性。我真正需要改变每一帧的一整套贝塞尔路径点,以产生具有随机幅度和控制点的全新正弦波。每个振幅的高度都是随机的,以近似于给定时间点的声波,动画是随时间变化的声音模式。我所看到的所有示例都是沿贝塞尔路径更改属性并在每一帧中遍历路径的动画。我需要动画改变每一帧的所有贝塞尔点。我可以在这里使用故事板还是只需要在某种计时器上绘制画布?

【问题讨论】:

【参考方案1】:

在 XAML 中没有简单的方法可以做到这一点,对于您的问题,像 Direct2D 这样的即时模式渲染技术似乎是更好的选择。我认为 XAML 中的 Path 控件不具备实时波形渲染所需的性能特征。

由于您似乎想使用 Storyboard 为其设置动画 - 看来您可能正在考虑预先确定的动画,在这种情况下,您可能只需使用此类动画的视频录制。

否则 - 您可以使用 CompositionTarget.Rendering 事件通过代码隐藏更新每个帧中的路径。

【讨论】:

感谢您的回复。波形过渡在随机持续时间后重新创建随机波形,以使外观与旋律相关,因此我不能使用视频,因为它是静态的。它现在正在使用计时器和调度程序工作,但是当部署到表面 RT 时,降级使其无法使用(它在我的笔记本电脑和 Surface 上工作正常)。屏幕上有四个贝塞尔路径,当被触摸时开始动画,当第四个在 Surface-RT 上被触摸时,它会变慢。 我放弃了故事板路线,因为没有依赖属性我可以在不创建动画的情况下使用它,而且我不知道这样做我会看到很多改进。我假设这会将一些处理移动到渲染线程。我相信它最终仍然会成为一个似乎表现不佳的依赖动画。看起来 DirectX 编码需要我学习 C++,这可能需要一些时间。对于 CompositionTarget.Rendering,布局看起来无法更改,但我似乎可以写入画布,对吧? 我再次尝试使用情节提要,并在我的用户控件上创建了自己的属性,称为“Frame”,声明为双重希望我可以使用 DoubleAnimation 为 5 个左右的帧设置动画,将幅度改变为给人一种振荡的错觉。似乎 DoubleAnimation 忽略了我自己的属性,但如果我尝试使用 usercontrols 宽度,它就可以工作。除了作为依赖属性之外,我还需要以什么特殊方式声明该属性吗? 您需要在针对自定义属性的动画上将 EnableDependentAnimation 设置为 true。 重要的是要提到,如果您将 EnableDependentAnimation 设置为 true,您将使用 UI 线程而不是合成器线程来渲染动画。最终,这意味着您的 UIthread 将比平时更忙,并且您的 UI 很容易最终丢失帧,从而导致“滞后”。

以上是关于如何在 XAML 中为 WinRT 中的贝塞尔路径设置动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# XAML WinRT 中使用字符串变量设置控件的属性?

如何使用 xaml Themeresource 属性更改 winrt 应用程序的背景颜色和强调颜色

Windows 商店应用程序 WInRT XAML C# - 如何获取导航页面文本框值

如何从托管项目中引用本机 WinRT 组件?

UWP - Flyout中的WinRT xaml工具包TreeView,在弹出窗口关闭后更改选择

WinRT译加工在 XAML 中制作圆形图片