使用CustomClipper绘制一个不规则的形状,然后使用CustomPainter给这个形状添加边框和背景色
这里显示中间形状
Padding(
padding: EdgeInsets.all(20),
child: ClipPath(
clipper: BackgroundClipper(),
child: CustomPaint(
painter: GradientBorderPainter(),
child: Container(
height: MediaQuery.of(context).size.width,
width: MediaQuery.of(context).size.width,
),
),
),
),
形状绘制
class BackgroundClipper extends CustomClipper<Path> {
@override
Path getClip(Size size) {
double roundnessFactor = 50.0;
Path path = Path();
//移动到A点
path.moveTo(0, size.height * 0.33);
//画直线到B点 同时也充当 下一个二阶贝塞尔曲线 的起点
path.lineTo(0, size.height - roundnessFactor);
//二阶贝塞尔曲线 只有一个控制点
// 控制点 C (0, size.height)
// 终点 D (roundnessFactor, size.height)
path.quadraticBezierTo(0, size.height, roundnessFactor, size.height);
//二阶贝塞尔曲线 只有一个控制点
//画直线到 E点 同时也充当 二阶贝塞尔曲线 的起点
path.lineTo(size.width - roundnessFactor, size.height);
// 控制点 F (size.width, size.height)
// 终点 G (size.width, size.height - roundnessFactor)
path.quadraticBezierTo(
size.width, size.height, size.width, size.height - roundnessFactor);
//二阶贝塞尔曲线 只有一个控制点
//画直线到 H 点 同时也充当 二阶贝塞尔曲线 的起点
path.lineTo(size.width, roundnessFactor * 2);
// 控制点 M 与 终点 K
path.quadraticBezierTo(size.width - 10, roundnessFactor,
size.width - roundnessFactor * 1.5, roundnessFactor * 1.5);
//二阶贝塞尔曲线 只有一个控制点
//画直线到 T点 同时也充当 二阶贝塞尔曲线 的起点
path.lineTo(
roundnessFactor * 0.6, size.height * 0.33 - roundnessFactor * 0.3);
//控制点 W Z
path.quadraticBezierTo(
0, size.height * 0.33, 0, size.height * 0.33 + roundnessFactor);
return path;
}
@override
bool shouldReclip(CustomClipper<Path> oldClipper) {
return true;
}
}
背景色绘制
class GradientBorderPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final Path path = BackgroundClipper().getClip(size);
final Paint paint = Paint()
..shader = LinearGradient(
colors: [Colors.red, Colors.blue],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
).createShader(Rect.fromLTWH(0, 0, size.width, size.height))
..style = PaintingStyle.stroke
..strokeWidth = 4;
// 绘制背景色
final Paint backgroundPaint = Paint()
..shader = LinearGradient(
colors: [Colors.purple, Colors.orange],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
).createShader(Rect.fromLTWH(0, 0, size.width, size.height));// 替换为你想要的背景色
canvas.drawPath(path, backgroundPaint);
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}