Commit 34238dd8 authored by Adam Barth's avatar Adam Barth

Force AnimatedVariables to hit begin on 0.0

We already forced hitting end on 1.0.

Fixes #1358
parent 445c512d
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import "dart:sky";
import 'dart:sky' show Color, Rect;
import 'package:sky/src/animation/curves.dart';
......@@ -16,8 +16,8 @@ enum Direction {
}
/// An interface describing a variable that changes as an animation progresses.
///
/// AnimatedVariables, by convention, must be cheap to create. This allows them to be used in
///
/// AnimatedVariables, by convention, must be cheap to create. This allows them to be used in
/// build functions in Widgets.
abstract class AnimatedVariable {
/// Update the variable to a given time in an animation that is running in the given direction
......@@ -57,12 +57,12 @@ class AnimationTiming {
Interval interval = _getInterval(direction);
if (interval != null)
t = interval.transform(t);
if (t == 1.0) // Or should we support inverse curves?
assert(t >= 0.0 && t <= 1.0);
if (t == 0.0 || t == 1.0) {
assert(t == _applyCurve(t, direction).round().toDouble());
return t;
Curve curve = _getCurve(direction);
if (curve != null)
t = curve.transform(t);
return t;
}
return _applyCurve(t, direction);
}
Interval _getInterval(Direction direction) {
......@@ -76,6 +76,13 @@ class AnimationTiming {
return curve;
return reverseCurve;
}
double _applyCurve(double t, Direction direction) {
Curve curve = _getCurve(direction);
if (curve == null)
return t;
return curve.transform(t);
}
}
/// An animated variable with a concrete type
......@@ -101,7 +108,12 @@ class AnimatedValue<T extends dynamic> extends AnimationTiming implements Animat
void setProgress(double t, Direction direction) {
if (end != null) {
t = transform(t, direction);
value = (t == 1.0) ? end : lerp(t);
if (t == 0.0)
value = begin;
else if (t == 1.0)
value = end;
else
value = lerp(t);
}
}
......
......@@ -102,11 +102,6 @@ class DismissableState extends State<Dismissable> {
..addListener(_handleResizeProgressChanged);
_resizePerformance.play();
});
// Our squash curve (ease) does not return v=0.0 for t=0.0, so we
// technically resize on the first frame. To make sure this doesn't confuse
// any other widgets (like MixedViewport, which checks for this kind of
// thing), we report a resize straight away.
_maybeCallOnResized();
}
void _handleResizeProgressChanged() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment