This reverts commit d8cd2ff484c7799db0a7ed01f1a448dba14e6cec.
This commit is contained in:
parent
537b592ed5
commit
4309fe863a
@ -30,29 +30,11 @@ abstract class Curve {
|
||||
|
||||
/// 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
|
||||
/// - Values of `t`=0.0 and `t`=1.0 must be mapped to 0.0 and 1.0,
|
||||
/// respectively.
|
||||
/// The value of `t` must be between 0.0 and 1.0, inclusive. Subclasses should
|
||||
/// assert that this is true.
|
||||
///
|
||||
/// 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();
|
||||
}
|
||||
/// A curve must map t=0.0 to 0.0 and t=1.0 to 1.0.
|
||||
double transform(double t);
|
||||
|
||||
/// Returns a new curve that is the reversed inversion of this one.
|
||||
///
|
||||
@ -81,7 +63,7 @@ class _Linear extends Curve {
|
||||
const _Linear._();
|
||||
|
||||
@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.
|
||||
@ -100,7 +82,10 @@ class SawTooth extends Curve {
|
||||
final int count;
|
||||
|
||||
@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;
|
||||
return t - t.truncateToDouble();
|
||||
}
|
||||
@ -143,12 +128,15 @@ class Interval extends Curve {
|
||||
final Curve curve;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
assert(begin >= 0.0);
|
||||
assert(begin <= 1.0);
|
||||
assert(end >= 0.0);
|
||||
assert(end <= 1.0);
|
||||
assert(end >= begin);
|
||||
if (t == 0.0 || t == 1.0)
|
||||
return t;
|
||||
t = ((t - begin) / (end - begin)).clamp(0.0, 1.0);
|
||||
if (t == 0.0 || t == 1.0)
|
||||
return t;
|
||||
@ -178,9 +166,12 @@ class Threshold extends Curve {
|
||||
final double threshold;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
assert(threshold >= 0.0);
|
||||
assert(threshold <= 1.0);
|
||||
if (t == 0.0 || t == 1.0)
|
||||
return t;
|
||||
return t < threshold ? 0.0 : 1.0;
|
||||
}
|
||||
}
|
||||
@ -246,7 +237,8 @@ class Cubic extends Curve {
|
||||
}
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
double start = 0.0;
|
||||
double end = 1.0;
|
||||
while (true) {
|
||||
@ -295,7 +287,7 @@ class FlippedCurve extends Curve {
|
||||
final Curve curve;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) => 1.0 - curve.transform(1.0 - t);
|
||||
double transform(double t) => 1.0 - curve.transform(1.0 - t);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
@ -314,7 +306,8 @@ class _DecelerateCurve extends Curve {
|
||||
const _DecelerateCurve._();
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
// Intended to match the behavior of:
|
||||
// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/animation/DecelerateInterpolator.java
|
||||
// ...as of December 2016.
|
||||
@ -346,7 +339,8 @@ class _BounceInCurve extends Curve {
|
||||
const _BounceInCurve._();
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
return 1.0 - _bounce(1.0 - t);
|
||||
}
|
||||
}
|
||||
@ -358,7 +352,8 @@ class _BounceOutCurve extends Curve {
|
||||
const _BounceOutCurve._();
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
return _bounce(t);
|
||||
}
|
||||
}
|
||||
@ -370,7 +365,8 @@ class _BounceInOutCurve extends Curve {
|
||||
const _BounceInOutCurve._();
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
if (t < 0.5)
|
||||
return (1.0 - _bounce(1.0 - t * 2.0)) * 0.5;
|
||||
else
|
||||
@ -397,7 +393,8 @@ class ElasticInCurve extends Curve {
|
||||
final double period;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
final double s = period / 4.0;
|
||||
t = t - 1.0;
|
||||
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 {
|
||||
final double period;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.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;
|
||||
}
|
||||
@ -453,7 +451,8 @@ class ElasticInOutCurve extends Curve {
|
||||
final double period;
|
||||
|
||||
@override
|
||||
double transformInternal(double t) {
|
||||
double transform(double t) {
|
||||
assert(t >= 0.0 && t <= 1.0);
|
||||
final double s = period / 4.0;
|
||||
t = 2.0 * t - 1.0;
|
||||
if (t < 0.0)
|
||||
|
@ -202,45 +202,4 @@ void main() {
|
||||
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);
|
||||
});
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user