在动画时间线的上下文中理解Flutter的SchedulerBinding。

问题描述 投票:-1回答:1

我试图理解下面这段代码中使用了 SchedulerBinding.instance.scheduleFrameCallback(beginFrame);. beginFrame 在下面的其他代码块中列出。

该代码来自于 此处,这是一个 翩翩起舞. 显然,我不指望有人能读懂这些。但考虑到一些上下文,你能理解它是用来干什么的吗?

上下文:这部分代码在一个叫做 setViewport. 时间轴的视口只是该时间轴的可见部分。因此,一旦设置了一个视口(一个 startend 点),它就会结束对时间轴上的某个东西的动画制作。你可以看到,在做的过程中,它调用了 SchedulerBinding.instance.scheduleFrameCallback这是我想知道是用来做什么的。我显然进入了 SchedulerBinding的页面 但解释太笼统了,我不知道它是用来干什么的。

    if (!animate) {
      _renderStart = start;
      _renderEnd = end;
      advance(0.0, false);
      if (onNeedPaint != null) {
        onNeedPaint();
      }
    } else if (!_isFrameScheduled) {
      _isFrameScheduled = true;
      _lastFrameTime = 0.0;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
    }

这是beginFrame.instance.scheduleFrameCallback(beginFrame)。

  /// Make sure that all the visible assets are being rendered and advanced
  /// according to the current state of the timeline.
  void beginFrame(Duration timeStamp) {
    _isFrameScheduled = false;
    final double t =
        timeStamp.inMicroseconds / Duration.microsecondsPerMillisecond / 1000.0;
    if (_lastFrameTime == 0.0) {
      _lastFrameTime = t;
      _isFrameScheduled = true;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
      return;
    }

    double elapsed = t - _lastFrameTime;
    _lastFrameTime = t;

    if (!advance(elapsed, true) && !_isFrameScheduled) {
      _isFrameScheduled = true;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
    }

    if (onNeedPaint != null) {
      onNeedPaint();
    }
  }
flutter animation dart android-animation
1个回答
0
投票

根据项目README,它用于保持Flare动画的同步。

"为了让动画正确地重现,有必要在每一帧调用当前FlutterActor的advance(elapsed). 此外,当前的ActorAnimation需要对它调用函数apply(time)来显示它正确的插值.这一切都是依靠Flutter的SchedulerBinding.scheduleFrameCallback()实现的。"

© www.soinside.com 2019 - 2024. All rights reserved.