paint method
void
paint(
- Canvas cv,
- Size size,
- double p,
- Offset center,
- Color color, {
- double radiusMultiplier = 1,
- Offset positionOffset = Offset.zero,
override
Implementation
@override
void paint(Canvas cv, Size size, double p, Offset center, Color color,
{double radiusMultiplier = 1, Offset positionOffset = Offset.zero}) {
final c = center + positionOffset;
final rnd = math.Random(42);
final minSide = math.min(size.width, size.height);
final spawnRadius = minSide * spawnScale * radiusMultiplier;
// sudut tetap
final angles = List<double>.generate(
particleCount,
(i) => useUniformAngle
? (i / particleCount) * 2 * math.pi
: rnd.nextDouble() * 2 * math.pi,
);
for (var i = 0; i < particleCount; i++) {
final delay = i * 0.02;
final rawT = p - delay;
if (rawT <= 0) continue;
final t = (rawT / (1 - delay)).clamp(0.0, 1.0);
final angle = angles[i];
// ── posisi radial ──
double dist;
if (t < _spawnEnd) {
final tt = t / _spawnEnd; // 0‑1
dist = spawnRadius * (1 - _easeOutQuad(tt));
} else if (t < _convergeEnd) {
final tt = (t - _spawnEnd) / (_convergeEnd - _spawnEnd);
dist = spawnRadius * (1 - _easeInBack(tt));
} else {
final tt = (t - _convergeEnd) / (1 - _convergeEnd);
dist = spawnRadius * (0.15 * (1 - tt)); // makin dekat ke 0
}
final pos = c + Offset(math.cos(angle), math.sin(angle)) * dist;
// ── skala & opasitas ──
final scale = t < _spawnEnd
? t / _spawnEnd
: t > _convergeEnd
? (1 - t) / (1 - _convergeEnd)
: 1.0;
final opacity = scale; // sama‑sama turun/naik
// ── warna ──
Color col = color;
if (enableHueTilt) {
final hsl = HSLColor.fromColor(color);
final shift = (angle / (2 * math.pi)) * 360 * hueTiltRange;
col = hsl
.withHue((hsl.hue + shift) % 360)
.withSaturation((hsl.saturation * saturationBoost).clamp(0, 1))
.toColor();
}
col = col.withOpacity(opacity.toDouble());
// ── gambar ──
final rad = circleRadius * radiusMultiplier * scale;
cv.drawCircle(pos, rad, Paint()..color = col);
final tailLen = rad * tailFactor;
final tailEnd = pos + Offset(math.cos(angle), math.sin(angle)) * tailLen;
cv.drawLine(
pos,
tailEnd,
Paint()
..color = col
..strokeWidth = rad * .8
..strokeCap = StrokeCap.round);
}
}