提交 9381792e 编写于 作者: A Adam Barth

fn-drawer sometimes doesn't tick closed

If there is jank, we might not get a frame time that's just after the last
frame, which means we'll stop generating animation frames before hitting 1.0
exactly.

In this CL, we introduce state to takeWhile to cancel the stream after emitting the
1.0.

R=rafaelw@chromium.org

Review URL: https://codereview.chromium.org/975153002
上级 aae2fbd5
......@@ -45,8 +45,6 @@ class FrameGenerator {
}
}
const double _kFrameTime = 1000 / 60;
class AnimationGenerator extends FrameGenerator {
Stream<double> get onTick => _stream;
......@@ -55,6 +53,7 @@ class AnimationGenerator extends FrameGenerator {
final double end;
final Curve curve;
Stream<double> _stream;
bool _done = false;
AnimationGenerator(this.duration, {
this.begin: 0.0,
......@@ -64,24 +63,23 @@ class AnimationGenerator extends FrameGenerator {
}):super(onDone: onDone) {
double startTime = 0.0;
double targetTime = 0.0;
bool done = false;
_stream = super.onTick.map((timeStamp) {
if (startTime == 0.0) {
startTime = timeStamp;
targetTime = startTime + duration;
}
// Clamp the final frame to target time so we terminate the series with
// 1.0 exactly.
if ((timeStamp - targetTime).abs() <= _kFrameTime) {
return 1.0;
}
return (timeStamp - startTime) / duration;
return math.min((timeStamp - startTime) / duration, 1.0);
})
.takeWhile((t) => t <= 1.0)
.takeWhile(_checkForCompletion)
.map((t) => begin + (end - begin) * curve.transform(t));
}
bool _checkForCompletion(double t) {
if (_done)
return false;
_done = t >= 1;
return true;
}
}
double _evaluateCubic(double a, double b, double m) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册