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;
  final random = math.Random(42); // Konsistensi antar frame

  // Jumlah bintang
  final int starCount = 15;

  // Fase 1: Concentrating (0-0.2)
  // Fase 2: Explosion (0.2-0.6)
  // Fase 3: Fading (0.6-1.0)

  for (int i = 0; i < starCount; i++) {
    // Sudut yang random tapi konsisten
    final double angle = random.nextDouble() * math.pi * 2;

    // Ukuran bintang yang bervariasi
    final double starSize = 3.0 + random.nextDouble() * 5.0;

    // Jarak maksimum untuk eksplosii
    final double maxDistance = size.width * 0.7 * radiusMultiplier;

    // Posisi awal dan akhir
    final Offset startPos = adjustedCenter;

    double currentDistance;
    double opacity;

    if (progress < 0.2) {
      // Fase 1: Bergerak ke pusat
      currentDistance = maxDistance * 0.2;
      opacity = progress / 0.2;
    } else if (progress < 0.6) {
      // Fase 2: Explosion
      double explosionProgress = (progress - 0.2) / 0.4;
      currentDistance = maxDistance * explosionProgress;
      opacity = 1.0;
    } else {
      // Fase 3: Fading out
      double fadeProgress = (progress - 0.6) / 0.4;
      currentDistance = maxDistance;
      opacity = 1.0 - fadeProgress;
    }

    // Posisi bintang saat ini
    final Offset starPos = Offset(
        adjustedCenter.dx +
            math.cos(angle) *
                currentDistance *
                (0.5 + random.nextDouble() * 0.5),
        adjustedCenter.dy +
            math.sin(angle) *
                currentDistance *
                (0.5 + random.nextDouble() * 0.5));

    // Menggambar bintang
    _drawStar(
        canvas,
        starPos,
        starSize,
        5, // jumlah titik bintang
        color.withOpacity(opacity));
  }
}