flutter自绘圆角矩形进度条
实现思路
要实现此效果我们需要3步,第一步画一个扇形展示进度,第二步画一个圆角正方形做外围,第三步将扇形放入到圆角正方形里。
画一个扇形,用来表示进度。
这里的扇形需要注意三点:1 扇形的半径是圆角正方形斜边的一半,即(宽幂+高幂)开根号。因为扇形的圆需要为圆角正方形的外切圆,否则扇形不能覆盖整个圆角正方形。
2 扇形大小和位置有drawArc的第一个参数控制(Rect),此Rect为矩形设置位置和大小之后扇形即为此矩形的内切圆。
3 按照需求圆角正方是一开始是实心的,有进度时出现了扇形缺口,所以初始值时100%,然后递减,上传完成之后进度为0;
1
2
3
4
5
6
7
8/// 用于画扇形
///
/// rect:控制扇形位置和大小的矩形,扇形圆为此矩形的内切圆
/// startAngle:扇形开位置
/// sweepAngle:扇形的弧度
/// useCenter:是否为实心
/// paint:画笔
Canva.drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint);画一个圆角正方形。
矩形的尺寸就是设计同学设计的大小,此处要注意矩形的的位置取决于扇形的位置。扇形圆为圆角正方形的内切圆,而圆角正方形的位置由左上角的坐标确定。扇形的控制矩形左上角为原点,推到出来圆角正方是的左上角坐标为(wrapWidth/2-arcWidth/2,wrapWidth/2-arcWidth/2);其中wrapWidth为扇形控制矩形的宽度,arcWidth为圆角矩形的宽度。1
2
3
4/// 目前dart库的Canvas提供直接使用的方法
///
/// 最后一个参数就是圆角弧度
Canvas.clipRRect(RRect.fromLTRBR(double left, double top, double right, double bottom,Radius radius));
下面是实现类,完整的代码请移步github项目
1 | class _RRectProgressIndicatorPainter extends CustomPainter { |