lerp static method
Linearly interpolate between two LinearSteps.
If either LinearSteps
is null
, this function linearly interpolates
from a LinearSteps
that matches the other in begin, end, stops and
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 Gradient? lerp(LinearShadedSteps? a, LinearShadedSteps? 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);
// return GradientTween(begin: a, end: b).lerp(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 LinearShadedSteps(
// shadeFactor:StepTween(begin: a.shadeFactor,end: b.shadeFactor).lerp(t),
shadeFactor: math.max(
0.0, ui.lerpDouble(a.shadeFactor, b.shadeFactor.toDouble(), t)!),
distance: math.max(0.0, ui.lerpDouble(a.distance, b.distance, t)!),
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,
begin: AlignmentGeometry.lerp(a.begin, b.begin, t)!,
end: AlignmentGeometry.lerp(a.end, b.end, t)!,
);
}