paint method

  1. @override
void paint(
  1. Canvas canvas,
  2. Size size,
  3. double progress,
  4. Offset center,
  5. Color color, {
  6. double radiusMultiplier = 1.0,
  7. 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);
  }
}