|
1 | 1 | import 'package:flutter/material.dart';
|
| 2 | +import 'package:flutter_screenutil/flutter_screenutil.dart'; |
2 | 3 |
|
3 | 4 | class WavyBottomNavigationBarClipper extends CustomClipper<Path> {
|
| 5 | + |
4 | 6 | @override
|
5 | 7 | Path getClip(Size size) {
|
6 | 8 | Path path = Path();
|
| 9 | + path.lineTo(0, 0); |
| 10 | + |
| 11 | + var zeroControlPoint = Offset(((size.width / 10) - 30.w) / 2, 0); |
| 12 | + var zeroEndPoint = Offset((size.width / 10) - 30.w, 35.w); |
| 13 | + path.quadraticBezierTo( |
| 14 | + zeroControlPoint.dx, |
| 15 | + zeroControlPoint.dy, |
| 16 | + zeroEndPoint.dx, |
| 17 | + zeroEndPoint.dy, |
| 18 | + ); |
7 | 19 |
|
8 |
| - path.lineTo(0, 2); |
9 |
| - path.lineTo(10, 3); |
10 |
| - path.lineTo(15, 5); |
11 |
| - path.lineTo(20, 10); |
12 |
| - var firstControlPoint = Offset((size.width / 3.6) - 40, 60); |
13 |
| - var firstEndPoint = Offset(size.width / 3.6, 10); |
| 20 | + path.lineTo(size.width / 10 - 30.w, 35.w); |
| 21 | + var firstControlPoint = Offset((size.width / 10) + 75.w, 160.w); |
| 22 | + var firstEndPoint = Offset((size.width / 10) + 150.w + 20.w, 35.w); |
14 | 23 | path.quadraticBezierTo(
|
15 | 24 | firstControlPoint.dx,
|
16 | 25 | firstControlPoint.dy,
|
17 | 26 | firstEndPoint.dx,
|
18 | 27 | firstEndPoint.dy,
|
19 | 28 | );
|
20 |
| - path.lineTo(size.width / 3.6, 10); |
| 29 | + path.lineTo((size.width / 10) + 150.w + 20.w, 35.w); |
21 | 30 |
|
22 |
| - var dxSecondEndPoint = size.width / 3; |
23 |
| - var secondControlPoint = Offset(dxSecondEndPoint + 5, -10); |
24 |
| - var secondEndPoint = Offset(dxSecondEndPoint + 25, 10); |
| 31 | + double widthMiddleEndPoint = size.width / 2; |
| 32 | + double temp1 = (size.width / 10) + 150.w + 20.w; |
| 33 | + double temp2 = widthMiddleEndPoint - 75.w - 20.w; |
| 34 | + double dxFirstMiddleControlPoint = temp1 + ((temp2 - temp1).abs() / 2); |
| 35 | + var firstMiddleControlPoint = Offset(dxFirstMiddleControlPoint, -20.w); |
| 36 | + var firstMiddleEndPoint = Offset(temp2, 35.w); |
25 | 37 | path.quadraticBezierTo(
|
26 |
| - secondControlPoint.dx, |
27 |
| - secondControlPoint.dy, |
28 |
| - secondEndPoint.dx, |
29 |
| - secondEndPoint.dy, |
| 38 | + firstMiddleControlPoint.dx, |
| 39 | + firstMiddleControlPoint.dy, |
| 40 | + firstMiddleEndPoint.dx, |
| 41 | + firstMiddleEndPoint.dy, |
30 | 42 | );
|
31 |
| - path.lineTo(dxSecondEndPoint + 25, 10); |
| 43 | + path.lineTo(dxFirstMiddleControlPoint, 0); |
32 | 44 |
|
33 |
| - var dxThirdEndPoint = size.width - (size.width / 2.5); |
34 |
| - var thirdControlPoint = Offset(dxThirdEndPoint - 36, 60); |
35 |
| - var thirdEndPoint = Offset((size.width / 3) * 2 - 25, 10); |
| 45 | + path.lineTo(widthMiddleEndPoint - 75.w - 20.w, 35.w); |
| 46 | + var middleControlPoint = Offset(widthMiddleEndPoint, 160.w); |
| 47 | + var middleEndPoint = Offset(widthMiddleEndPoint + 75.w + 20.w, 35.w); |
36 | 48 | path.quadraticBezierTo(
|
37 |
| - thirdControlPoint.dx, |
38 |
| - thirdControlPoint.dy, |
39 |
| - thirdEndPoint.dx, |
40 |
| - thirdEndPoint.dy, |
| 49 | + middleControlPoint.dx, |
| 50 | + middleControlPoint.dy, |
| 51 | + middleEndPoint.dx, |
| 52 | + middleEndPoint.dy, |
41 | 53 | );
|
| 54 | + path.lineTo(widthMiddleEndPoint + 75.w + 20.w, 35.w); |
42 | 55 |
|
43 |
| - var dxFourthEndPoint = (size.width / 3) * 2; |
44 |
| - var fourthControlPoint = Offset(dxFourthEndPoint + 5, -10); |
45 |
| - var fourthEndPoint = Offset(dxFourthEndPoint + 25, 10); |
| 56 | + double widthLastEndPoint = size.width - ((size.width / 10) + 150.w + 20.w); |
| 57 | + double widthLastEndPoint2 = size.width - ((size.width / 10) - 30.w); |
| 58 | + double temp3 = widthMiddleEndPoint + 75.w + 20.w; |
| 59 | + double temp4 = widthLastEndPoint; |
| 60 | + double dxLastMiddleControlPoint = temp3 + ((temp4 - temp3).abs() / 2); |
| 61 | + var lastMiddleControlPoint = Offset(dxLastMiddleControlPoint, -20.w); |
| 62 | + var lastMiddleEndPoint = Offset(temp4, 35.w); |
46 | 63 | path.quadraticBezierTo(
|
47 |
| - fourthControlPoint.dx, |
48 |
| - fourthControlPoint.dy, |
49 |
| - fourthEndPoint.dx, |
50 |
| - fourthEndPoint.dy, |
| 64 | + lastMiddleControlPoint.dx, |
| 65 | + lastMiddleControlPoint.dy, |
| 66 | + lastMiddleEndPoint.dx, |
| 67 | + lastMiddleEndPoint.dy, |
51 | 68 | );
|
| 69 | + path.lineTo(widthLastEndPoint, 35.w); |
52 | 70 |
|
53 |
| - var dxFifthEndPoint = size.width - ((size.width / 3.6) - 40); |
54 |
| - var fifthControlPoint = Offset(dxFifthEndPoint, 60); |
55 |
| - var fifthEndPoint = Offset(dxFifthEndPoint + 40, 10); |
| 71 | + var lastControlPoint = Offset(size.width - ((size.width / 10) + 75.w), 160.w); |
| 72 | + var lastEndPoint = Offset(widthLastEndPoint2, 35.w); |
56 | 73 | path.quadraticBezierTo(
|
57 |
| - fifthControlPoint.dx, |
58 |
| - fifthControlPoint.dy, |
59 |
| - fifthEndPoint.dx, |
60 |
| - fifthEndPoint.dy, |
| 74 | + lastControlPoint.dx, |
| 75 | + lastControlPoint.dy, |
| 76 | + lastEndPoint.dx, |
| 77 | + lastEndPoint.dy, |
61 | 78 | );
|
| 79 | + path.lineTo(widthLastEndPoint2, 35.w); |
62 | 80 |
|
63 |
| - path.lineTo(size.width - 20, 10); |
64 |
| - path.lineTo(size.width - 15, 5); |
65 |
| - path.lineTo(size.width - 10, 3); |
66 |
| - path.lineTo(size.width, 2); |
| 81 | + double widthLastEndPoint3 = size.width - (((size.width / 10) - 30.w) / 2); |
| 82 | + var lastControlPoint2 = Offset(widthLastEndPoint3, 0); |
| 83 | + var lastEndPoint2 = Offset(size.width, 0.w); |
| 84 | + path.quadraticBezierTo( |
| 85 | + lastControlPoint2.dx, |
| 86 | + lastControlPoint2.dy, |
| 87 | + lastEndPoint2.dx, |
| 88 | + lastEndPoint2.dy, |
| 89 | + ); |
| 90 | + |
| 91 | + path.lineTo(size.width, 0); |
67 | 92 | path.lineTo(size.width, size.height);
|
68 | 93 | path.lineTo(0, size.height);
|
69 | 94 | path.close();
|
70 |
| - |
71 | 95 | return path;
|
72 | 96 | }
|
73 | 97 |
|
|
0 commit comments