lerp static method
Linearly interpolate between two SweepStepss.
If either gradient is null
, this function linearly interpolates from a
a gradient that matches the other gradient in center, startAngle,
endAngle, stops & tileMode and with the same colors but
transparent (using scale).
The t
argument represents a position on the timeline, with 0.0
meaning
that the interpolation has not started, returning a
(or something
equivalent to a
); 1.0
meaning that the interpolation has finished,
returning b
(or something equivalent to b
); and values in between
0.0 < t < 1.0
meaning that the interpolation is at the relevant point as
a percentage along the timeline between a
and b
.
The interpolation can be extrapolated beyond 0.0
and 1.0
, so negative
values and values greater than 1.0
are valid (and can easily be
generated by curves such as Curves.elasticInOut).
Values for t
are usually obtained from an Animation<double>, such as
an AnimationController
.
Implementation
static SweepSteps? lerp(SweepSteps? a, SweepSteps? b, double t) {
if (a == null && b == null) return null;
if (a == null) return b!.scale(t);
if (b == null) return a.scale(1.0 - t);
// final stretched = PrimitiveGradient.fromStretchLerp(a, b, t);
// final interpolated = PrimitiveGradient.byProgressiveMerge(
// t < 0.5 ? PrimitiveGradient.from(a) : stretched,
// t < 0.5 ? stretched : PrimitiveGradient.from(b),
// // t < 0.5 ? t * 2 : (t - 0.5) * 2);
// t);
final interpolated = PrimitiveGradient.byCombination(a, b, t);
// final interpolated = PrimitiveGradient.fromStretchLerp(a, b, t);
// final interpolated = PrimitiveGradient.byProgressiveMerge(
// PrimitiveGradient.from(a), PrimitiveGradient.from(b), t);
return SweepSteps(
softness: math.max(0.0, ui.lerpDouble(a.softness, b.softness, t)!),
colors: interpolated.colors,
stops: interpolated.stops,
// TODO: Interpolate Matrix4 / GradientTransform
transform: t > 0.5 ? a.transform : b.transform,
// TODO: interpolate tile mode
tileMode: t < 0.5 ? a.tileMode : b.tileMode,
center: AlignmentGeometry.lerp(a.center, b.center, t)!,
startAngle: math.max(0.0, ui.lerpDouble(a.startAngle, b.startAngle, t)!),
endAngle: math.max(0.0, ui.lerpDouble(a.endAngle, b.endAngle, t)!),
);
}