From 34238dd879793edd5b8f46c7a4fd9a59eb26eed7 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Fri, 2 Oct 2015 23:21:40 -0700 Subject: [PATCH] Force AnimatedVariables to hit begin on 0.0 We already forced hitting end on 1.0. Fixes #1358 --- .../lib/src/animation/animated_value.dart | 30 +++++++++++++------ .../flutter/lib/src/widgets/dismissable.dart | 5 ---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/flutter/lib/src/animation/animated_value.dart b/packages/flutter/lib/src/animation/animated_value.dart index 68da613971..732c8f2855 100644 --- a/packages/flutter/lib/src/animation/animated_value.dart +++ b/packages/flutter/lib/src/animation/animated_value.dart @@ -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 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); } } diff --git a/packages/flutter/lib/src/widgets/dismissable.dart b/packages/flutter/lib/src/widgets/dismissable.dart index fe270ab390..6cb2a78e9b 100644 --- a/packages/flutter/lib/src/widgets/dismissable.dart +++ b/packages/flutter/lib/src/widgets/dismissable.dart @@ -102,11 +102,6 @@ class DismissableState extends State { ..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() {