/* * 如果只有一个圆的情况下,请设置已完成的圆 默认的圆的颜色不要设置 */ import 'dart:math'; import 'package:flutter/cupertino.dart'; class MyPainter extends CustomPainter { //默认的线的背景颜色 Color lineColor; //默认的线的宽度 double width; //已完成线的颜色 Color? completeColor; //已完成的百分比 double? completePercent; //已完成的线的宽度 double completeWidth; // 从哪开始 1从下开始, 2 从上开始 3 从左开始 4 从右开始 默认从下开始 double startType; //是不是虚线的圈 bool isDividerRound; //中间的实圆 统计线条是不是渐变的圆 bool isGradient; //结束的位置 double endAngle; //默认的线的背景颜色 List? lineColors; //实心圆阴影颜色 // Color shadowColor; //渐变圆 深色在下面 还是在左面 默认在下面 bool isTransfrom; MyPainter({ required this.lineColor, this.completeColor, this.completePercent, required this.width, this.completeWidth = 0, this.startType = 1, this.isDividerRound = false, this.isGradient = false, this.endAngle = pi * 2, this.lineColors, this.isTransfrom = false, // this.shadowColor, }); @override void paint(Canvas canvas, Size size) { Offset center = Offset(size.width / 2, size.height / 2); // 坐标中心 double radius = min(size.width / 2, size.height / 2); // 半径 //是否有第二层圆 //是不是 虚线圆 if (isDividerRound) { //背景的线 Paint line = Paint() ..color = lineColor // ..strokeCap = StrokeCap.round ..style = PaintingStyle.stroke ..isAntiAlias = true ..strokeWidth = width; double i = 0.00; while (i < pi * 2) { canvas.drawArc(Rect.fromCircle(center: center, radius: radius), i, 0.15, false, line); i = i + 0.3; } } else { //背景的线 实线 Paint line = Paint() ..color = lineColor ..strokeCap = StrokeCap.round ..style = PaintingStyle.stroke ..strokeWidth = width; canvas.drawCircle( // 画圆方法 center, radius, line); } //画上面的圆 if (completeWidth > 0) { double arcAngle = 2 * pi * ((completePercent ?? 0) / 100); // 从哪开始 1从下开始, 2 从上开始 3 从左开始 4 从右开始 默认从下开始 double start = pi / 2; if (startType == 2) { start = -pi / 2; } else if (startType == 3) { start = pi; } else if (startType == 4) { start = pi * 2; } //创建画笔 Paint paint = Paint() ..strokeCap = StrokeCap.round ..style = PaintingStyle.stroke ..strokeWidth = completeWidth; ///是渐变圆 if (isGradient && (lineColors?.isNotEmpty ?? false)) { //渐变圆 深色位置偏移量 默认深色在下面 double transfrom; if (isTransfrom == false) { //深色在下面 transfrom = -pi / 2; } else { //深色在左面 transfrom = pi * 2; } paint.shader = SweepGradient( startAngle: 0.0, endAngle: pi * 2, colors: lineColors!, tileMode: TileMode.clamp, transform: GradientRotation(transfrom), ).createShader( Rect.fromCircle(center: center, radius: radius), ); canvas.drawArc(Rect.fromCircle(center: center, radius: radius), start, arcAngle, false, paint); } else { if (completeColor != null) { ///是实体圆 paint.color = completeColor!; } canvas.drawArc( Rect.fromCircle(center: center, radius: radius), start, // -pi / 2,从正上方开始 pi / 2,从下方开始 arcAngle, false, paint, ); } } } @override bool shouldRepaint(CustomPainter oldDelegate) => false; }