如何在 flutter 中创建具有圆角边缘的自定义容器?
How to create a custom container with rounded edges in flutter?
我正在尝试创建一个带有圆边但不能使边角变圆的自定义容器。
我只是想把绿色容器的角弄圆。
class MyPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
var paint = Paint()
..color = Colors.green.withOpacity(0.8)
..strokeWidth = 5
..strokeCap = StrokeCap.round;
final shapeBounds = Rect.fromLTRB(0, 0, size.width, size.height);
final path = Path()
..moveTo(shapeBounds.left + 10, shapeBounds.top) //3
..lineTo(shapeBounds.bottomLeft.dx + 10,shapeBounds.bottomLeft.dy)
..lineTo(shapeBounds.bottomRight.dx,shapeBounds.bottomRight.dy - size.height * 0.12)
..lineTo(shapeBounds.topRight.dx - 20,
shapeBounds.topRight.dy + size.height * 0.12) //7
..close();
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
// TODO: implement shouldRepaint
return false;
}
}
您可以使用 ClipPath。在其中使用 Custom Clipper。在 Custom Clipper 中,绘制路径时使用 quadraticBezierTo.
class MyContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ClipPath(
clipper: MyClipper(),
child: Container(
child: Text("Dummy Text"),
alignment: Alignment.center,
color: Colors.green,
width: 200,
height: 200,
),
);
}
}
class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
final path = Path();
path
..lineTo(0.0, size.height * 0.1)
..quadraticBezierTo(0, 0, size.width * 0.1, 0)
..lineTo(size.width * 0.8, size.height * 0.12)
..quadraticBezierTo(size.width * 0.9, size.height * 0.15,
size.width * 0.9, size.height * 0.2)
..lineTo(size.width, size.height * 0.9)
..quadraticBezierTo(
size.width, size.height, size.width * 0.9, size.height)
..lineTo(size.width * 0.2, size.height * 0.9)
..quadraticBezierTo(size.width * 0.1, size.height * 0.9, size.width * 0.1,
size.height * 0.8)
..close();
return path;
}
@override
bool shouldReclip(CustomClipper oldClipper) {
return false;
}
}
与其使用 Rect
给你一个普通的矩形,不如使用 RRect
给你想要的圆角矩形,如果你需要演示代码请评论。
如果你想要所有角落的圆角。
Container(
decoration:BoxDecoration(
borderRadius:BorderRadius.circular(double radius)
)
)
如果你想在特定的角落有圆角。
Container(
decoration:BoxDecoration(
borderRadius:BorderRadius.only(
topLeft:Radius.circular()
topRight :Radius.circular()
bottomLeft :Radius.circular()
bottomRight :Radius.circular()
)
)
)
有关详细信息,请查看此 link:https://api.flutter.dev/flutter/painting/BorderRadius-class.html
我正在尝试创建一个带有圆边但不能使边角变圆的自定义容器。
class MyPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
var paint = Paint()
..color = Colors.green.withOpacity(0.8)
..strokeWidth = 5
..strokeCap = StrokeCap.round;
final shapeBounds = Rect.fromLTRB(0, 0, size.width, size.height);
final path = Path()
..moveTo(shapeBounds.left + 10, shapeBounds.top) //3
..lineTo(shapeBounds.bottomLeft.dx + 10,shapeBounds.bottomLeft.dy)
..lineTo(shapeBounds.bottomRight.dx,shapeBounds.bottomRight.dy - size.height * 0.12)
..lineTo(shapeBounds.topRight.dx - 20,
shapeBounds.topRight.dy + size.height * 0.12) //7
..close();
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
// TODO: implement shouldRepaint
return false;
}
}
您可以使用 ClipPath。在其中使用 Custom Clipper。在 Custom Clipper 中,绘制路径时使用 quadraticBezierTo.
class MyContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ClipPath(
clipper: MyClipper(),
child: Container(
child: Text("Dummy Text"),
alignment: Alignment.center,
color: Colors.green,
width: 200,
height: 200,
),
);
}
}
class MyClipper extends CustomClipper<Path> {
Path getClip(Size size) {
final path = Path();
path
..lineTo(0.0, size.height * 0.1)
..quadraticBezierTo(0, 0, size.width * 0.1, 0)
..lineTo(size.width * 0.8, size.height * 0.12)
..quadraticBezierTo(size.width * 0.9, size.height * 0.15,
size.width * 0.9, size.height * 0.2)
..lineTo(size.width, size.height * 0.9)
..quadraticBezierTo(
size.width, size.height, size.width * 0.9, size.height)
..lineTo(size.width * 0.2, size.height * 0.9)
..quadraticBezierTo(size.width * 0.1, size.height * 0.9, size.width * 0.1,
size.height * 0.8)
..close();
return path;
}
@override
bool shouldReclip(CustomClipper oldClipper) {
return false;
}
}
与其使用 Rect
给你一个普通的矩形,不如使用 RRect
给你想要的圆角矩形,如果你需要演示代码请评论。
如果你想要所有角落的圆角。
Container(
decoration:BoxDecoration(
borderRadius:BorderRadius.circular(double radius)
)
)
如果你想在特定的角落有圆角。
Container(
decoration:BoxDecoration(
borderRadius:BorderRadius.only(
topLeft:Radius.circular()
topRight :Radius.circular()
bottomLeft :Radius.circular()
bottomRight :Radius.circular()
)
)
)
有关详细信息,请查看此 link:https://api.flutter.dev/flutter/painting/BorderRadius-class.html