Flutter 动画控制器速度不反映应用的曲线

Flutter Animation Controller Velocity Does Not Reflect Curve Applied

前言:这不是调试问题--没有代码问题--代码仅供说明。

我正在使用 Flutter 中的动画控制器。

单独使用 controller.forward 和控制器(未应用曲线),controller.velocity 属性 在动画期间保持不变...这是可以预料的。

所以我心想,“啊...我将向动画控制器应用一条曲线...然后速度 属性 将直接对应于所应用的曲线!”

我添加了这段代码:

// 'ac' is the Animation Controller

myCurve = CurvedAnimation(parent: ac, curve: Curves.easeInOutCirc);

myTween = new Tween(
  begin: 0.0,
  end: 1.0,
).animate(myCurve);

我预计:

A) controller.value 属性 会自动产生新计算的速度。

B) 我可以改用 myCurve.velocity 或 myTween.velocity,这将产生新的计算速度。

我已经在视觉上验证了曲线是否正确应用于动画,但我也可以(视觉上)和打印调试看到 controller.velocity 产生与没有时相同的速度(恒定)已应用曲线,并且 myCurve 或 myTween 都没有速度 属性!

当然有一种方法可以访问与应用曲线相关的某个地方的速度 属性。

我试过谷歌搜索,但这是很难避免更一般结果的主题之一。

“速度”是 AnimationController 的 属性,而不是 Animation class 或 Tween [=] 的 属性 35=]。如果你想得到一个已知函数的变化率,你可以对该函数求导。

So I thought to myself, "Ah... I'll apply a curve to the animation controller... then the velocity property will correspond directly to the curve applied!"

不,您不是在“将曲线应用于动画控制器”。您正在创建一个 Animation<double> 类型的实例,由控制器“驱动”。你创建了一个新对象。原始的“动画控制器”没有任何变异。

可以这样想:假设我们有一个函数 f(t) = t,那就是您的“动画控制器”。当 t(时间)过半时(假设我们处于 0.5 秒,如果总持续时间为 1 秒),“动画控制器的值”将是 f(0.5) = 0.5,这是正确的,假设默认范围为0.0 到 1.0。动画控制器的“速度”在动画时为 1,在停止时为 0。

现在假设您想将价值输出加倍,您将另一个功能 g(x) = 2x“链接”到您的控制器 f(t),因此您最终会得到 g(f(t)) = 2(t) = 2tg(x)的变化率是2,而原来的f(t)的变化率仍然是1。动画控制器保持不变,只是用来“喂养”另一个功能。链式“最终结果”(g(f(t))) 是一种 Animation<double> 类型,没有可用的“速度”方法。

要计算速度,您可以使用 Tween.transform 来评估任何输入,并通过对感兴趣域中的多个点进行采样来估计变化率。另一种方法是对曲线函数求导以获得准确的变化率。话虽如此,我想不出想要知道速度的用例。如果您可以分享更多关于为什么您想知道链接动画的速度,也许我们可以建议一些其他方法来实现它。