generateParticles static method
List<ConfettiParticle>
generateParticles({
- required ConfettiType confettiType,
- required ConfettiStyle confettiStyle,
- required AnimationConfetti animationStyle,
- required ConfettiColorTheme colorTheme,
- required ConfettiDensity density,
- required bool isColorMixedFromModel,
Implementation
static List<ConfettiParticle> generateParticles({
required ConfettiType confettiType,
required ConfettiStyle confettiStyle,
required AnimationConfetti animationStyle,
required ConfettiColorTheme colorTheme,
required ConfettiDensity density,
required bool isColorMixedFromModel,
}) {
final rand = math.Random();
final List<ConfettiParticle> particles = [];
int quantity;
switch (density) {
case ConfettiDensity.low:
quantity = 50;
break;
case ConfettiDensity.medium:
quantity = 100;
break;
case ConfettiDensity.high:
quantity = 200;
break;
}
// Extra for celebration/levelUp
if (confettiType == ConfettiType.celebration ||
confettiType == ConfettiType.levelUp) {
quantity = (quantity * 1.5).round();
}
for (int i = 0; i < quantity; i++) {
// Calculate initial position based on animation style
Offset position = _calculateInitialPosition(animationStyle, rand);
// Calculate velocity based on animation style
Offset velocity = _calculateInitialVelocity(animationStyle, rand);
// Get color based on theme
Color color = _getColorFromTheme(
rand, colorTheme, confettiType, isColorMixedFromModel);
// Calculate size
double size = 5.0 + rand.nextDouble() * 5.0;
if (confettiStyle == ConfettiStyle.star ||
confettiStyle == ConfettiStyle.emoji) {
size *= 1.5;
}
// Calculate rotation speed
double rotationSpeed = 0.0;
if (confettiStyle == ConfettiStyle.star ||
confettiStyle == ConfettiStyle.ribbons ||
confettiStyle == ConfettiStyle.paper) {
rotationSpeed = (rand.nextDouble() - 0.5) * 10.0;
}
// Get emoji if needed
String? emoji;
if (confettiStyle == ConfettiStyle.emoji) {
emoji = _getRandomEmoji(confettiType, rand);
}
// Create particle using factory method
particles.add(
ConfettiParticle.create(
position: position,
velocity: velocity,
color: color,
size: size,
rotationSpeed: rotationSpeed,
emoji: emoji,
opacity: 0.8 + rand.nextDouble() * 0.2,
lifespan: 0.7 + rand.nextDouble() * 0.3,
style: confettiStyle,
),
);
}
return particles;
}