Unverified Commit 4309fe86 authored by Todd Volkert's avatar Todd Volkert Committed by GitHub

Revert "Ensure all curves return 0 and 1 in .transform(t) when t=0/1 (#27409)" (#27919)

This reverts commit d8cd2ff4.
parent 537b592e
...@@ -30,29 +30,11 @@ abstract class Curve { ...@@ -30,29 +30,11 @@ abstract class Curve {
/// Returns the value of the curve at point `t`. /// Returns the value of the curve at point `t`.
/// ///
/// This function must ensure the following: /// The value of `t` must be between 0.0 and 1.0, inclusive. Subclasses should
/// - The value of `t` must be between 0.0 and 1.0 /// assert that this is true.
/// - Values of `t`=0.0 and `t`=1.0 must be mapped to 0.0 and 1.0, ///
/// respectively. /// A curve must map t=0.0 to 0.0 and t=1.0 to 1.0.
/// double transform(double t);
/// It is recommended that subclasses override [transformInternal] instead of
/// this function, as the above cases are already handled in the default
/// implementation of [transform], which delegates the remaining logic to
/// [transformInternal].
double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t == 0.0 || t == 1.0) {
return t;
}
return transformInternal(t);
}
/// Returns the value of the curve at point `t`, in cases where
/// 1.0 > `t` > 0.0.
@protected
double transformInternal(double t) {
throw UnimplementedError();
}
/// Returns a new curve that is the reversed inversion of this one. /// Returns a new curve that is the reversed inversion of this one.
/// ///
...@@ -81,7 +63,7 @@ class _Linear extends Curve { ...@@ -81,7 +63,7 @@ class _Linear extends Curve {
const _Linear._(); const _Linear._();
@override @override
double transformInternal(double t) => t; double transform(double t) => t;
} }
/// A sawtooth curve that repeats a given number of times over the unit interval. /// A sawtooth curve that repeats a given number of times over the unit interval.
...@@ -100,7 +82,10 @@ class SawTooth extends Curve { ...@@ -100,7 +82,10 @@ class SawTooth extends Curve {
final int count; final int count;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t == 1.0)
return 1.0;
t *= count; t *= count;
return t - t.truncateToDouble(); return t - t.truncateToDouble();
} }
...@@ -143,12 +128,15 @@ class Interval extends Curve { ...@@ -143,12 +128,15 @@ class Interval extends Curve {
final Curve curve; final Curve curve;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(begin >= 0.0); assert(begin >= 0.0);
assert(begin <= 1.0); assert(begin <= 1.0);
assert(end >= 0.0); assert(end >= 0.0);
assert(end <= 1.0); assert(end <= 1.0);
assert(end >= begin); assert(end >= begin);
if (t == 0.0 || t == 1.0)
return t;
t = ((t - begin) / (end - begin)).clamp(0.0, 1.0); t = ((t - begin) / (end - begin)).clamp(0.0, 1.0);
if (t == 0.0 || t == 1.0) if (t == 0.0 || t == 1.0)
return t; return t;
...@@ -178,9 +166,12 @@ class Threshold extends Curve { ...@@ -178,9 +166,12 @@ class Threshold extends Curve {
final double threshold; final double threshold;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
assert(threshold >= 0.0); assert(threshold >= 0.0);
assert(threshold <= 1.0); assert(threshold <= 1.0);
if (t == 0.0 || t == 1.0)
return t;
return t < threshold ? 0.0 : 1.0; return t < threshold ? 0.0 : 1.0;
} }
} }
...@@ -246,7 +237,8 @@ class Cubic extends Curve { ...@@ -246,7 +237,8 @@ class Cubic extends Curve {
} }
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
double start = 0.0; double start = 0.0;
double end = 1.0; double end = 1.0;
while (true) { while (true) {
...@@ -295,7 +287,7 @@ class FlippedCurve extends Curve { ...@@ -295,7 +287,7 @@ class FlippedCurve extends Curve {
final Curve curve; final Curve curve;
@override @override
double transformInternal(double t) => 1.0 - curve.transform(1.0 - t); double transform(double t) => 1.0 - curve.transform(1.0 - t);
@override @override
String toString() { String toString() {
...@@ -314,7 +306,8 @@ class _DecelerateCurve extends Curve { ...@@ -314,7 +306,8 @@ class _DecelerateCurve extends Curve {
const _DecelerateCurve._(); const _DecelerateCurve._();
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
// Intended to match the behavior of: // Intended to match the behavior of:
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java // https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java
// ...as of December 2016. // ...as of December 2016.
...@@ -346,7 +339,8 @@ class _BounceInCurve extends Curve { ...@@ -346,7 +339,8 @@ class _BounceInCurve extends Curve {
const _BounceInCurve._(); const _BounceInCurve._();
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return 1.0 - _bounce(1.0 - t); return 1.0 - _bounce(1.0 - t);
} }
} }
...@@ -358,7 +352,8 @@ class _BounceOutCurve extends Curve { ...@@ -358,7 +352,8 @@ class _BounceOutCurve extends Curve {
const _BounceOutCurve._(); const _BounceOutCurve._();
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
return _bounce(t); return _bounce(t);
} }
} }
...@@ -370,7 +365,8 @@ class _BounceInOutCurve extends Curve { ...@@ -370,7 +365,8 @@ class _BounceInOutCurve extends Curve {
const _BounceInOutCurve._(); const _BounceInOutCurve._();
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
if (t < 0.5) if (t < 0.5)
return (1.0 - _bounce(1.0 - t * 2.0)) * 0.5; return (1.0 - _bounce(1.0 - t * 2.0)) * 0.5;
else else
...@@ -397,7 +393,8 @@ class ElasticInCurve extends Curve { ...@@ -397,7 +393,8 @@ class ElasticInCurve extends Curve {
final double period; final double period;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0; final double s = period / 4.0;
t = t - 1.0; t = t - 1.0;
return -math.pow(2.0, 10.0 * t) * math.sin((t - s) * (math.pi * 2.0) / period); return -math.pow(2.0, 10.0 * t) * math.sin((t - s) * (math.pi * 2.0) / period);
...@@ -425,7 +422,8 @@ class ElasticOutCurve extends Curve { ...@@ -425,7 +422,8 @@ class ElasticOutCurve extends Curve {
final double period; final double period;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0; final double s = period / 4.0;
return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.pi * 2.0) / period) + 1.0; return math.pow(2.0, -10 * t) * math.sin((t - s) * (math.pi * 2.0) / period) + 1.0;
} }
...@@ -453,7 +451,8 @@ class ElasticInOutCurve extends Curve { ...@@ -453,7 +451,8 @@ class ElasticInOutCurve extends Curve {
final double period; final double period;
@override @override
double transformInternal(double t) { double transform(double t) {
assert(t >= 0.0 && t <= 1.0);
final double s = period / 4.0; final double s = period / 4.0;
t = 2.0 * t - 1.0; t = 2.0 * t - 1.0;
if (t < 0.0) if (t < 0.0)
......
...@@ -202,45 +202,4 @@ void main() { ...@@ -202,45 +202,4 @@ void main() {
expect(() => Curves.bounceInOut.transform(1.0001), throwsAssertionError); expect(() => Curves.bounceInOut.transform(1.0001), throwsAssertionError);
}); });
test('Curve transform method should return 0.0 for t=0.0 and 1.0 for t=1.0', () {
expect(const SawTooth(2).transform(0), 0);
expect(const SawTooth(2).transform(1), 1);
expect(const Interval(0, 1).transform(0), 0);
expect(const Interval(0, 1).transform(1), 1);
expect(const Threshold(0.5).transform(0), 0);
expect(const Threshold(0.5).transform(1), 1);
expect(const ElasticInCurve().transform(0), 0);
expect(const ElasticInCurve().transform(1), 1);
expect(const ElasticOutCurve().transform(0), 0);
expect(const ElasticOutCurve().transform(1), 1);
expect(const ElasticInOutCurve().transform(0), 0);
expect(const ElasticInOutCurve().transform(1), 1);
expect(Curves.linear.transform(0), 0);
expect(Curves.linear.transform(1), 1);
expect(Curves.easeInOutExpo.transform(0), 0);
expect(Curves.easeInOutExpo.transform(1), 1);
expect(const FlippedCurve(Curves.easeInOutExpo).transform(0), 0);
expect(const FlippedCurve(Curves.easeInOutExpo).transform(1), 1);
expect(Curves.decelerate.transform(0), 0);
expect(Curves.decelerate.transform(1), 1);
expect(Curves.bounceIn.transform(0), 0);
expect(Curves.bounceIn.transform(1), 1);
expect(Curves.bounceOut.transform(0), 0);
expect(Curves.bounceOut.transform(1), 1);
expect(Curves.bounceInOut.transform(0), 0);
expect(Curves.bounceInOut.transform(1), 1);
});
} }
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