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;
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));
}
}