기초편에서 나만의 직선을 그려서 도형을 만드는 방법을 학습했으니, 이제 도형과 곡선을 마스터 해보자
그리고 직선을 그릴때 좀더 유용한 메서드들이 있으니 그것도 추가로 학습해보자.
이번에도 가로 세로 200의 정사각형 네모를 기준으로 설명하겠다.
class MyClipper extends CustomClipper<Path> {
MyClipper();
Path getClip(Size size) {
Path path = Path()
..addRect(Rect.fromCenter(center: Offset(50, 60), width: 40, height: 70))
..addRRect(RRect.fromLTRBR(120, 100, 180, 180, Radius.circular(10)))
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
class MyClipper extends CustomClipper<Path> {
MyClipper();
Path getClip(Size size) {
Path path = Path()
..addOval(Rect.fromCenter(center: Offset(50, 60), width: 40, height: 70))
..addOval(Rect.fromPoints(Offset(150, 150), Offset(200, 200)))
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
class MyClipper extends CustomClipper<Path> {
List<Offset> polygon = [
Offset(100, 20),
Offset(85, 65),
Offset(45, 64),
Offset(75, 95),
Offset(58, 140),
Offset(100, 110),
Offset(142, 140),
Offset(125, 95),
Offset(155, 64),
Offset(115, 65),
Offset(100, 20),
];
Path getClip(Size size) {
Path path = Path()
..addPolygon(polygon, false)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
..quadraticBezierTo(x1, y1, x2, y2)
로 선언하며class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
double w = size.width;
double h = size.height;
Path path = Path()
..quadraticBezierTo(w / 2, h / 2, w, 0) // 정 가운데를 중심으로
..lineTo(w, h)
..lineTo(0, h)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
double w = size.width;
double h = size.height;
// 편의를 위해 w/2 가 아니라 100 같은 정수로 써두겠다.
Path path = Path()
..moveTo(0, h / 2)
..quadraticBezierTo(25, 50, 50, 100)
..quadraticBezierTo(75, 150, 100, 100)
..quadraticBezierTo(125, 50, 150, 100)
..quadraticBezierTo(175, 150, 200, 100)
..lineTo(w, h)
..lineTo(0, h)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
quadraticBezierTo()
메서드에서 컨트롤 포인트를 2개로 늘렸다고 생각하면 된다...cubicTo(x1, y1, x2, y2, x3, y3)
형태로 선언하며 맨 마지막에 들어가는 (x3, y3)이 도착점이고, 시작점 부터 도착점(x3, y3)까지 가는 중에 첫 번째 조절점(x1, y1)과 두 번째 조절점(x2, y2)의 좌표를 입력하여 두 조절점을 이용해 곡선을 그린다.class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
double w = size.width;
double h = size.height;
Path path = Path()
..moveTo(0, h / 2)
..cubicTo(75, 0, 125, 200, 200, 100)
..lineTo(w, h)
..lineTo(0, h)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
..arcToPoint(Offset(dx, dy), radius: radius, clockwise: clockwise = true)
형식으로 선언한다.class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
Path path = Path()
..moveTo(0, 50)
..arcToPoint(
Offset(50, 0),
radius: Radius.circular(50),
)
..lineTo(120, 0)
..arcToPoint(Offset(200, 50), radius: Radius.elliptical(100, 60))
..lineTo(200, 150)
..arcToPoint(Offset(150, 200),
radius: Radius.circular(60),
clockwise: false // 기본 true, 역시계방향 할 때만 사용하며 false로.
)
..lineTo(50, 200)
..arcToPoint(Offset(0, 150),
radius: Radius.elliptical(20, 30), clockwise: false)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
..arcTo(rect, startAngle, sweepAngle, forceMoveTo)
이렇게 선언한다. 첫 인자인 Rect 클래스는 fromPoints, fromCircle, fromLTRB, fromLTWH 등으로 다양하게 사용할 수 있는데 이들을 파악히게 앞서서 원의 시작각과 끝각을 어떻게 지정하는지 알아야 한다.class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
Path path = Path()
..moveTo(0, 50)
..arcTo(Rect.fromCenter(center: Offset(50, 50), width: 100, height: 100),
1 * pi, 0.5 * pi, false)
..lineTo(150, 0)
..arcTo(
Rect.fromCircle(center: Offset(150, 50), radius: 50),
1.5 * pi,
0.5 * pi, // 얼마나 호를 그을건지
false)
..lineTo(200, 150)
..arcTo(Rect.fromLTRB(100, 100, 200, 200), 2 * pi, 0.5 * pi, false)
..lineTo(50, 200)
..arcTo(Rect.fromLTWH(0, 100, 100, 100), 0.5 * pi, 0.5 * pi, false)
..close();
return path;
}
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
myPath.addPath(newPath, Offset(dx/dy));
`..relativeLineTo(dx, dy)`로 선언한다.