【问题标题】:Flutter difference between Timer and AnimationController usesTimer 和 AnimationController 使用 Flutter 的区别
【发布时间】:2020-04-21 03:43:44
【问题描述】:

我有动画和计时器。我知道计时器是让第二个刻度恰好在第二个标记处滴答作响的最佳方式。对于动画,我使用了 AnimationController 和 Timer,持续时间很短(100 毫秒)。我想我一定遗漏了一些东西,因为我不完全理解何时应该分别使用 Timer 和 AnimationController。它们都导致 setState() 并因此导致 Build(并因此重绘)。我想一个想法是,如果我可以保留所有屏幕,并且只重绘动画中的一个小变化。 全面披露:我正在参加 Flutter Clock 挑战赛!!!

【问题讨论】:

    标签: animation flutter timer redraw


    【解决方案1】:

    Timer 与 Flutter 无关,只是一个计时器,就像您在任何其他语言中都可以使用的一样。

    另一方面,AnimationController(和Ticker,其等效于Timer)是特定于 Flutter 的。

    Timer 的区别在于,通过使用AnimationController,“ticker”可以静音、减慢或模拟。

    因此,使用AnimationController 我们有一些好处:

    • 如果相关的小部件不可见,则动画会暂停(这就是 vsync arg 的用途)
    • 我们可以使用“慢速动画”开发工具,它只让动画的秒数变慢
    • 测试可以“模拟”这些计时器。因此,如果动画持续 3 秒,则测试可以模拟整个动画,而无需实际等待 3 秒。

    【讨论】:

    • 我担心(或理解)所有这些动画都会调用 setState(),但有些动画不必经常重绘。据我所知:我可以使用每个 setState() 传递一个参数来指示这是哪个动画,但是我必须保留其他动画在它们的“纪元”时绘制的内容。可能(但我不确定)repaintBoundary 可以从最后一个主画面开始绘制屏幕图像,比如 1 秒,更改,并且可能绘制在此动画更改的小区域上。我在寻找正确的方向吗?
    • ..或者,即使可以保存屏幕图像,也可能会消耗资源,并且在每个动画激活 Build 方法时绘制所有内容可能同样有效
    • 我不明白你在说什么。你能改写一下吗?
    • 我想我现在明白我的问题了。我每 16 毫秒有一个动画 donig setState() (就像所有动画一样,我认为我无法改变它)。这些动画是在 Canvas Paint 中完成的。我也有小部件,以及一些每 1 秒更改一次的绘图。我认为这是低效的,因为所有这些东西每 16 毫秒重绘一次相同的图像。但这行得通,即使它效率低下。问题是我在构建布局中有一些小部件,我希望在 500 毫秒到 2 秒的时间内拥有自己的动画(例如 AnimatedOpacity)。这些每 16 毫秒重绘一次,所以不要工作
    猜你喜欢
    • 2020-07-16
    • 2019-08-03
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2023-01-18
    • 2014-06-07
    • 2020-08-20
    • 2022-01-02
    相关资源
    最近更新 更多