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) = 2t
。 g(x)
的变化率是2,而原来的f(t)
的变化率仍然是1。动画控制器保持不变,只是用来“喂养”另一个功能。链式“最终结果”(g(f(t))) 是一种 Animation<double>
类型,没有可用的“速度”方法。
要计算速度,您可以使用 Tween.transform
来评估任何输入,并通过对感兴趣域中的多个点进行采样来估计变化率。另一种方法是对曲线函数求导以获得准确的变化率。话虽如此,我想不出想要知道速度的用例。如果您可以分享更多关于为什么您想知道链接动画的速度,也许我们可以建议一些其他方法来实现它。
前言:这不是调试问题--没有代码问题--代码仅供说明。
我正在使用 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) = 2t
。 g(x)
的变化率是2,而原来的f(t)
的变化率仍然是1。动画控制器保持不变,只是用来“喂养”另一个功能。链式“最终结果”(g(f(t))) 是一种 Animation<double>
类型,没有可用的“速度”方法。
要计算速度,您可以使用 Tween.transform
来评估任何输入,并通过对感兴趣域中的多个点进行采样来估计变化率。另一种方法是对曲线函数求导以获得准确的变化率。话虽如此,我想不出想要知道速度的用例。如果您可以分享更多关于为什么您想知道链接动画的速度,也许我们可以建议一些其他方法来实现它。