计算系数以获得正常速度动画

我使用一些WPF动画来垂直移动UserControl。

这是代码

public void RestartAnimation(double contentControlHeight, double thisHeight) { if (cp != null && IsLoaded) da.From = contentControlHeight; da.To = -thisHeight; da.RepeatBehavior = RepeatBehavior.Forever; da.Duration = new Duration(TimeSpan.FromSeconds(this.Duration)); sb.Children.Clear(); sb.Children.Add(da); Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Top)")); Storyboard.SetTarget(da, cp); sb.Begin(); } } 

它工作正常,但我发现如果高度更高,那么运动更快。

所以我需要实现两件事:

一些速度范围值,即1-100(非常慢 – 超快),内部我需要一些公式/系数来做到这一点。

我做了一些静态速度和不同高度的实验,得到了一些表格。

在此处输入图像描述

请帮我弄清楚我只需设置速度范围(1-100)即可进行哪些计算,无论 StackPanel 高度 如何,它都能正常工作

感谢你们!

我不确定你应该对比率(StackPanel Height / ContentControl Height)感兴趣,而只是差异 (StackPanel Height – ContentControl Height)。

假设您希望您的速度为每秒30像素(实际上相当慢,但只是从您的“速度”值开始)。 您可能有兴趣根据以每秒30像素的速率覆盖像素距离(高度差)所需的秒数来设置持续时间。

所以你只需要:

 var duration = TimeSpan.FromSeconds((thisHeight - contentControlHeight) / pixelPerSecondSpeed); 

这就是你如何将速度保持恒定。

您需要规范化动画的持续时间。 因此,假设堆叠面板高度与内容控制高度的比率为0.5 ,则N秒的持续时间被视为“正常速度”(您应该确定此时的N是多少)。

所以现在让我们说有一些比率R不同于0.5 ,我们想知道动画的持续时间应该是多少。 这很简单:

 var duration = TimeSpan.FromSeconds(N * R / 0.5); 

我们假设您也希望使用标准化的持续时间标度。 假设这个线性标尺100对应于“正常”速度; 让我们说较低的数字可以实现更快的动画效果,因此1“几乎是即时的”而200则是“正常速度的一半”。 我们称之为标准化持续时间norm 。 然后你有:

 var absoluteDuration = TimeSpan.FromSeconds(N * R / 0.5); var normalizedDuration = absoluteDuration.Seconds * norm / 100;