72 lines
1.8 KiB
Dart
72 lines
1.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../theme/focus_flow_tokens.dart';
|
|
|
|
class RewardIcon extends StatelessWidget {
|
|
const RewardIcon({
|
|
this.color = FocusFlowTokens.accentMagenta,
|
|
this.size = 24,
|
|
super.key,
|
|
});
|
|
|
|
final Color color;
|
|
final double size;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return CustomPaint(
|
|
size: Size.square(size),
|
|
painter: _RewardIconPainter(color),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _RewardIconPainter extends CustomPainter {
|
|
const _RewardIconPainter(this.color);
|
|
|
|
final Color color;
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
final paint = Paint()
|
|
..color = color
|
|
..style = PaintingStyle.fill;
|
|
_drawSparkle(
|
|
canvas,
|
|
paint,
|
|
size.center(Offset.zero),
|
|
size.shortestSide * 0.44,
|
|
);
|
|
_drawSparkle(
|
|
canvas,
|
|
paint,
|
|
Offset(size.width * 0.78, size.height * 0.24),
|
|
size.shortestSide * 0.18,
|
|
);
|
|
_drawSparkle(
|
|
canvas,
|
|
paint,
|
|
Offset(size.width * 0.24, size.height * 0.78),
|
|
size.shortestSide * 0.14,
|
|
);
|
|
}
|
|
|
|
void _drawSparkle(Canvas canvas, Paint paint, Offset center, double radius) {
|
|
final path = Path()
|
|
..moveTo(center.dx, center.dy - radius)
|
|
..lineTo(center.dx + radius * 0.24, center.dy - radius * 0.24)
|
|
..lineTo(center.dx + radius, center.dy)
|
|
..lineTo(center.dx + radius * 0.24, center.dy + radius * 0.24)
|
|
..lineTo(center.dx, center.dy + radius)
|
|
..lineTo(center.dx - radius * 0.24, center.dy + radius * 0.24)
|
|
..lineTo(center.dx - radius, center.dy)
|
|
..lineTo(center.dx - radius * 0.24, center.dy - radius * 0.24)
|
|
..close();
|
|
canvas.drawPath(path, paint);
|
|
}
|
|
|
|
@override
|
|
bool shouldRepaint(covariant _RewardIconPainter oldDelegate) {
|
|
return oldDelegate.color != color;
|
|
}
|
|
}
|