Flutter——Canvas之最权威仪表盘进度实战

开发背景:

公司需求;
在这里插入图片描述

  1. 确定圆心坐标
   double radius = size.width / 2;
   double centerX = size.width / 2;
   double centerY = size.height;
  1. 绘制最下面的半圆
Paint backgroundPaint = Paint()
      ..color = Color(0xffF8F8F8)
      ..style = PaintingStyle.fill;

    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: radius),
      pi,
      pi,
      true,
      backgroundPaint,
    );

  1. 绘制中间的半圆
    backgroundPaint.color = Color(0xff28AFF3);
    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: radius - 11.w),
      pi, // Start angle
      pi, // Sweep angle
      true, // Use center
      backgroundPaint,
    );

  1. 加粗样式
///每一份的角度值
    double lineJiaodu = 0;
    ///当前进度占比值
    double shanxingbaifenbi = 0;
    if (maxNumber != 0) {
    ///传进来的进度值,加50个值,后面避免每次绘制占比都是满状态
      var totalNumber = maxNumber + 50;
      lineJiaodu = pi / totalNumber;
      shanxingbaifenbi = maxNumber / totalNumber;
    }
    ///角度
    double angle = pi + lineJiaodu * maxNumber;
    ///计算开始位置的坐标
    double startX = centerX + (radius - 25.w) * cos(angle);
    double startY = centerY + (radius - 25.w) * sin(angle);
    double endX = startX - 70.w * cos(angle); // 刻度线长度为10
    double endY = startY - 70.w * sin(angle);
    ///避免指针绘制属于叠加状态
    if (maxNumber == 1 || maxNumber == 0) {
      startY = startY - 3.w;
      endY = endY - 3.w;
    }
  1. 绘制进度颜色

    backgroundPaint.color = Color(0xffF6A658);
    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: radius - 11.w),
      pi, // Start angle
      shanxingbaifenbi * pi, // Sweep angle
      true, // Use center
      backgroundPaint,
    );
  1. 绘制半圆
   backgroundPaint.color = Color(0xffF8F8F8);
    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: radius - 40.w),
      pi,
      pi,
      true,
      backgroundPaint,
    );

    // backgroundPaint.color = Colors.red;
    backgroundPaint.color = Color(0xffF5F5F5);
    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: centerX * 0.62),
      pi,
      pi,
      true,
      backgroundPaint,
    );

    backgroundPaint.color = Color(0xffFFFFFF);
    canvas.drawArc(
      Rect.fromCircle(center: Offset(centerX, centerY), radius: centerX * 0.4),
      pi, // Start angle
      pi, // Sweep angle
      true, // Use center
      backgroundPaint,
    );
  1. 绘制圆上的刻度线
 Paint linePaint = Paint()
      ..color = Colors.white
      ..strokeWidth = 2.w;

    double angleIncrement = pi / 7; // 每个刻度之间的角度增量

    for (int i = 0; i <= 7; i++) {
      double angle = pi + angleIncrement * i;
      if (i == 0) {
        angle = angle + 0.02222222;
      }
      if (i == 7) {
        angle = angle - 0.02222222;
      }
      double startX = centerX + (radius - 21.w) * cos(angle);
      double startY = centerY + (radius - 21.w) * sin(angle);
      double endX = startX + 10.w * cos(angle); // 刻度线长度为10
      double endY = startY + 10.w * sin(angle);
      canvas.drawLine(Offset(startX, startY), Offset(endX, endY), linePaint);
    }
  1. 绘制指针线
    Paint linePaint1 = Paint()
      ..color = Colors.white
      ..strokeWidth = 6.w;

    canvas.drawLine(Offset(startX, startY), Offset(endX, endY), linePaint1);

  1. 绘制底部文本最大值

    drawText(
      "$maxNumber",
      size.width / 2,
      size.height,
      "s",
      24.sp,
      Color(0xff333333),
      "center",
      "bottom",
    );
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flutter CanvasFlutter 框架提供的一个功能强大的绘图 API,它允许你直接在屏幕上绘制图形、文本和其他视觉元素。你可以使用 Flutter Canvas 创建自定义的 UI 控件、动画效果以及图表等。 通过 Flutter Canvas,你可以使用各种绘图方法来绘制形状、路径、渐变、图片和文本等。你可以使用 Canvas 类提供的方法来绘制直线、曲线、圆形、矩形等基本形状,还可以使用 Path 类来创建复杂的路径。同时,你也可以设置画笔的样式、颜色和透明度等属性,来实现各种视觉效果。 在 Flutter 中使用 Canvas,你需要在自定义的绘制方法中重写父类的 paint 方法,并将 Canvas 对象作为参数传入。然后,你可以在这个方法中使用 Canvas 对象提供的方法来绘制你想要的图形。 例如,下面是一个简单的 Flutter Canvas 绘制一个红色圆形的示例代码: ```dart import 'package:flutter/material.dart'; class MyCanvasWidget extends StatelessWidget { @override Widget build(BuildContext context) { return CustomPaint( painter: MyPainter(), ); } } class MyPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { final paint = Paint() ..color = Colors.red ..style = PaintingStyle.fill; final center = Offset(size.width / 2, size.height / 2); final radius = size.width / 4; canvas.drawCircle(center, radius, paint); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { return false; } } ``` 这段代码定义了一个自定义的绘制 Widget `MyCanvasWidget`,并在其 `paint` 方法中使用 Canvas 绘制了一个红色的圆形。在 Flutter 的 UI 树中使用 `CustomPaint` 包裹这个自定义的绘制 Widget,即可将这个绘制效果显示在屏幕上。 希望这个简单的示例可以帮助你了解 Flutter Canvas 的基本使用方法。如果你有更多关于 Flutter Canvas 的问题,欢迎继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怀君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值