lerp static method
Linearly interpolate between two RadialShadedStepss.
If either gradient is null
, this function linearly interpolates from a
a gradient that matches the other gradient in center, radius, 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 RadialShadedSteps? lerp(
RadialShadedSteps? a, RadialShadedSteps? 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 RadialShadedSteps(
// 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,
center: AlignmentGeometry.lerp(a.center, b.center, t)!,
radius: math.max(0.0, ui.lerpDouble(a.radius, b.radius, t)!),
focal: AlignmentGeometry.lerp(a.focal, b.focal, t),
focalRadius:
math.max(0.0, ui.lerpDouble(a.focalRadius, b.focalRadius, t)!),
);
}