我试图理解下面这段代码中使用了 SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
. beginFrame
在下面的其他代码块中列出。
该代码来自于 此处,这是一个 翩翩起舞. 显然,我不指望有人能读懂这些。但考虑到一些上下文,你能理解它是用来干什么的吗?
上下文:这部分代码在一个叫做 setViewport
. 时间轴的视口只是该时间轴的可见部分。因此,一旦设置了一个视口(一个 start
和 end
点),它就会结束对时间轴上的某个东西的动画制作。你可以看到,在做的过程中,它调用了 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();
}
}
根据项目README,它用于保持Flare动画的同步。
"为了让动画正确地重现,有必要在每一帧调用当前FlutterActor的advance(elapsed). 此外,当前的ActorAnimation需要对它调用函数apply(time)来显示它正确的插值.这一切都是依靠Flutter的SchedulerBinding.scheduleFrameCallback()实现的。"