5 changed files with 9567 additions and 1 deletions
-
1assets/animations/confetti.json
-
9268assets/animations/lights_purple.json
-
295lib/features/level/presentation/ui/widgets/level_path.dart
-
2pubspec.lock
-
2pubspec.yaml
1
assets/animations/confetti.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
9268
assets/animations/lights_purple.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,295 @@ |
|||||
|
import 'package:flutter/material.dart'; |
||||
|
import 'package:path_drawing/path_drawing.dart'; |
||||
|
|
||||
|
class LevelPath extends StatelessWidget { |
||||
|
const LevelPath({super.key}); |
||||
|
|
||||
|
@override |
||||
|
Widget build(BuildContext context) { |
||||
|
return CustomPaint(size: Size(361, 2233), painter: CurvedPathPainter()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
class CurvedPathPainter extends CustomPainter { |
||||
|
@override |
||||
|
void paint(Canvas canvas, Size size) { |
||||
|
// Scale factor to fit the design |
||||
|
final scaleX = size.width / 361; |
||||
|
final scaleY = size.height / 2233; |
||||
|
|
||||
|
final paint = Paint() |
||||
|
..color = Colors.white |
||||
|
..strokeWidth = 3 |
||||
|
..style = PaintingStyle.stroke |
||||
|
..strokeCap = StrokeCap.round; |
||||
|
|
||||
|
// First path (bottom curve) |
||||
|
final path1 = Path(); |
||||
|
path1.moveTo(86.9641 * scaleX, 2231.26 * scaleY); |
||||
|
path1.cubicTo( |
||||
|
195.179 * scaleX, |
||||
|
2177.98 * scaleY, |
||||
|
178.692 * scaleX, |
||||
|
2126.01 * scaleY, |
||||
|
178.692 * scaleX, |
||||
|
2126.01 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
164.374 * scaleX, |
||||
|
2080.87 * scaleY, |
||||
|
102.793 * scaleX, |
||||
|
2100.22 * scaleY, |
||||
|
94.3613 * scaleX, |
||||
|
2069.15 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
79.334 * scaleX, |
||||
|
2013.78 * scaleY, |
||||
|
112.538 * scaleX, |
||||
|
2035.55 * scaleY, |
||||
|
109.368 * scaleX, |
||||
|
1964.11 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
107.037 * scaleX, |
||||
|
1911.59 * scaleY, |
||||
|
170.879 * scaleX, |
||||
|
1904.82 * scaleY, |
||||
|
206.38 * scaleX, |
||||
|
1866.04 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
242.924 * scaleX, |
||||
|
1826.13 * scaleY, |
||||
|
297.122 * scaleX, |
||||
|
1847.48 * scaleY, |
||||
|
330.868 * scaleX, |
||||
|
1805.17 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
369.124 * scaleX, |
||||
|
1757.21 * scaleY, |
||||
|
356.865 * scaleX, |
||||
|
1650.25 * scaleY, |
||||
|
356.865 * scaleX, |
||||
|
1650.25 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
356.865 * scaleX, |
||||
|
1650.25 * scaleY, |
||||
|
327.352 * scaleX, |
||||
|
1579.89 * scaleY, |
||||
|
320.723 * scaleX, |
||||
|
1532.1 * scaleY, |
||||
|
); |
||||
|
path1.cubicTo( |
||||
|
313.484 * scaleX, |
||||
|
1479.91 * scaleY, |
||||
|
325.584 * scaleX, |
||||
|
1397.26 * scaleY, |
||||
|
325.584 * scaleX, |
||||
|
1397.26 * scaleY, |
||||
|
); |
||||
|
|
||||
|
// Second path (top curve) |
||||
|
final path2 = Path(); |
||||
|
path2.moveTo(140.464 * scaleX, 1.50636 * scaleY); |
||||
|
path2.cubicTo( |
||||
|
140.464 * scaleX, |
||||
|
1.50636 * scaleY, |
||||
|
139.141 * scaleX, |
||||
|
-0.0589981 * scaleY, |
||||
|
114.441 * scaleX, |
||||
|
45.9425 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
91.5014 * scaleX, |
||||
|
88.6635 * scaleY, |
||||
|
57.6838 * scaleX, |
||||
|
106.774 * scaleY, |
||||
|
55.4723 * scaleX, |
||||
|
155.213 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
52.7912 * scaleX, |
||||
|
213.94 * scaleY, |
||||
|
128.813 * scaleX, |
||||
|
286.676 * scaleY, |
||||
|
128.813 * scaleX, |
||||
|
286.676 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
128.813 * scaleX, |
||||
|
286.676 * scaleY, |
||||
|
155.78 * scaleX, |
||||
|
337.75 * scaleY, |
||||
|
151.85 * scaleX, |
||||
|
372.064 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
148.066 * scaleX, |
||||
|
405.109 * scaleY, |
||||
|
112.75 * scaleX, |
||||
|
447.729 * scaleY, |
||||
|
112.75 * scaleX, |
||||
|
447.729 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
112.75 * scaleX, |
||||
|
447.729 * scaleY, |
||||
|
16.9303 * scaleX, |
||||
|
455.877 * scaleY, |
||||
|
6.0151 * scaleX, |
||||
|
501.202 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
-1.31338 * scaleX, |
||||
|
531.634 * scaleY, |
||||
|
29.8983 * scaleX, |
||||
|
577.713 * scaleY, |
||||
|
29.8983 * scaleX, |
||||
|
577.713 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
29.8983 * scaleX, |
||||
|
577.713 * scaleY, |
||||
|
-18.1423 * scaleX, |
||||
|
654.926 * scaleY, |
||||
|
10.665 * scaleX, |
||||
|
687.618 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
34.3963 * scaleX, |
||||
|
714.549 * scaleY, |
||||
|
101.548 * scaleX, |
||||
|
701.356 * scaleY, |
||||
|
101.548 * scaleX, |
||||
|
701.356 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
101.548 * scaleX, |
||||
|
701.356 * scaleY, |
||||
|
234.377 * scaleX, |
||||
|
670.297 * scaleY, |
||||
|
258.796 * scaleX, |
||||
|
727.564 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
270.16 * scaleX, |
||||
|
754.214 * scaleY, |
||||
|
258.796 * scaleX, |
||||
|
801.75 * scaleY, |
||||
|
258.796 * scaleX, |
||||
|
801.75 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
258.796 * scaleX, |
||||
|
801.75 * scaleY, |
||||
|
248.847 * scaleX, |
||||
|
848.935 * scaleY, |
||||
|
254.781 * scaleX, |
||||
|
878.261 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
261.069 * scaleX, |
||||
|
909.339 * scaleY, |
||||
|
291.345 * scaleX, |
||||
|
950.756 * scaleY, |
||||
|
291.345 * scaleX, |
||||
|
950.756 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
291.345 * scaleX, |
||||
|
950.756 * scaleY, |
||||
|
282.736 * scaleX, |
||||
|
1008.09 * scaleY, |
||||
|
258.796 * scaleX, |
||||
|
1032.97 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
240.05 * scaleX, |
||||
|
1052.46 * scaleY, |
||||
|
198.137 * scaleX, |
||||
|
1066.37 * scaleY, |
||||
|
198.137 * scaleX, |
||||
|
1066.37 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
198.137 * scaleX, |
||||
|
1066.37 * scaleY, |
||||
|
166.656 * scaleX, |
||||
|
1088.74 * scaleY, |
||||
|
143.819 * scaleX, |
||||
|
1097.44 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
121.262 * scaleX, |
||||
|
1106.03 * scaleY, |
||||
|
83.3713 * scaleX, |
||||
|
1110.33 * scaleY, |
||||
|
83.3713 * scaleX, |
||||
|
1110.33 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
83.3713 * scaleX, |
||||
|
1110.33 * scaleY, |
||||
|
32.7909 * scaleX, |
||||
|
1133.78 * scaleY, |
||||
|
25.8826 * scaleX, |
||||
|
1163.59 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
18.5162 * scaleX, |
||||
|
1195.38 * scaleY, |
||||
|
59.4881 * scaleX, |
||||
|
1240.1 * scaleY, |
||||
|
59.4881 * scaleX, |
||||
|
1240.1 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
59.4881 * scaleX, |
||||
|
1240.1 * scaleY, |
||||
|
110.19 * scaleX, |
||||
|
1264.23 * scaleY, |
||||
|
143.819 * scaleX, |
||||
|
1276.88 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
172.99 * scaleX, |
||||
|
1287.85 * scaleY, |
||||
|
219.696 * scaleX, |
||||
|
1301.61 * scaleY, |
||||
|
219.696 * scaleX, |
||||
|
1301.61 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
219.696 * scaleX, |
||||
|
1301.61 * scaleY, |
||||
|
288.856 * scaleX, |
||||
|
1304.54 * scaleY, |
||||
|
312.964 * scaleX, |
||||
|
1328.51 * scaleY, |
||||
|
); |
||||
|
path2.cubicTo( |
||||
|
330.039 * scaleX, |
||||
|
1345.48 * scaleY, |
||||
|
325.464 * scaleX, |
||||
|
1397.51 * scaleY, |
||||
|
325.464 * scaleX, |
||||
|
1397.51 * scaleY, |
||||
|
); |
||||
|
|
||||
|
final dashArray = CircularIntervalList<double>(const [3.08, 13.1]); |
||||
|
final dashArray2 = CircularIntervalList<double>(const [3.08, 13.1]); |
||||
|
|
||||
|
// Simply pass the Path objects directly to dashPath |
||||
|
final dashed = dashPath(path1, dashArray: dashArray); |
||||
|
final dashed2 = dashPath(path2, dashArray: dashArray2); |
||||
|
|
||||
|
canvas.drawPath(dashed, paint); |
||||
|
canvas.drawPath(dashed2, paint); |
||||
|
} |
||||
|
|
||||
|
@override |
||||
|
bool shouldRepaint(covariant CustomPainter oldDelegate) => false; |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue