Merge pull request #1474 from abarth/hit_zero
Force AnimatedVariables to hit begin on 0.0
This commit is contained in:
commit
472c440396
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user