paint method
void
paint(
- Canvas canvas,
- Size size,
- double progress,
- Offset center,
- Color color, {
- double radiusMultiplier = 1.0,
- Offset positionOffset = Offset.zero,
override
Implementation
@override
void paint(
Canvas canvas, Size size, double progress, Offset center, Color color,
{double radiusMultiplier = 1.0, Offset positionOffset = Offset.zero}) {
final adjustedCenter = center + positionOffset;
// Calculate widget dimensions
final widgetRadius = math.min(size.width, size.height) * 0.5;
// Animation phases:
// 0.0-0.2: Quick explosive growth
// 0.2-0.7: Energetic pulsing
// 0.7-1.0: Fade out with bounce
double scaleProgress;
double opacityProgress = 1.0;
double pulseEffect = 0.0;
if (progress < 0.2) {
// Explosive growth phase
scaleProgress =
_elasticOut(progress / 0.2); // Elastic overshoot for "pop" effect
pulseEffect = progress / 0.2;
} else if (progress < 0.7) {
// Energetic pulsing phase
scaleProgress = 1.0;
final pulseProgress = (progress - 0.2) / 0.5;
pulseEffect =
0.7 + 0.3 * math.sin(pulseProgress * math.pi * 5); // Fast pulsing
} else {
// Fade out phase with bounce
final fadeOutProgress = (progress - 0.7) / 0.3;
scaleProgress = 1.0 +
0.1 * math.sin(fadeOutProgress * math.pi * 3); // Bouncy fade-out
opacityProgress = 1.0 - fadeOutProgress;
pulseEffect = 0.5 + 0.5 * (1.0 - fadeOutProgress);
}
// Draw ripple effects (behind rays)
if (addRipples) {
_drawRippleEffects(canvas, adjustedCenter, color, widgetRadius, progress,
opacityProgress);
}
// Draw the main rays
_drawClickRays(canvas, adjustedCenter, color, widgetRadius, scaleProgress,
opacityProgress, pulseEffect, radiusMultiplier);
// Draw sparkles for extra pizzazz
if (addSparkles) {
_drawSparkles(canvas, adjustedCenter, color, widgetRadius, progress,
opacityProgress, scaleProgress);
}
}