Force AnimatedVariables to hit begin on 0.0

We already forced hitting end on 1.0.

Fixes #1358
This commit is contained in:
Adam Barth 2015-10-02 23:21:40 -07:00
parent 445c512d2c
commit 34238dd879
2 changed files with 21 additions and 14 deletions

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import "dart:sky"; import 'dart:sky' show Color, Rect;
import 'package:sky/src/animation/curves.dart'; import 'package:sky/src/animation/curves.dart';
@ -57,12 +57,12 @@ class AnimationTiming {
Interval interval = _getInterval(direction); Interval interval = _getInterval(direction);
if (interval != null) if (interval != null)
t = interval.transform(t); 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; return t;
Curve curve = _getCurve(direction); }
if (curve != null) return _applyCurve(t, direction);
t = curve.transform(t);
return t;
} }
Interval _getInterval(Direction direction) { Interval _getInterval(Direction direction) {
@ -76,6 +76,13 @@ class AnimationTiming {
return curve; return curve;
return reverseCurve; 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 /// 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) { void setProgress(double t, Direction direction) {
if (end != null) { if (end != null) {
t = transform(t, direction); 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);
} }
} }

View File

@ -102,11 +102,6 @@ class DismissableState extends State<Dismissable> {
..addListener(_handleResizeProgressChanged); ..addListener(_handleResizeProgressChanged);
_resizePerformance.play(); _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() { void _handleResizeProgressChanged() {