focus-flow/apps/focus_flow_flutter/lib/widgets/timeline/reward_icon.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;
}
}