You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中用drawLine()和drawCircle()绘制带4条均分直径的圆形

解决Flutter中CustomPaint绘制均分圆形直径的问题

你当前的问题在于:绘制的线条是从屏幕边缘延伸到边缘,而非贴合圆形边界;同时未通过角度计算实现线条的均匀分布。以下是修正方案:

核心改进要点

  • 统一圆心与半径参数:避免硬编码,确保线条与圆形的边界匹配,防止线条超出或未覆盖圆形。
  • 用三角函数计算精确端点:通过角度转弧度,结合余弦、正弦函数计算圆上的坐标,保证线条恰好连接圆形边缘。
  • 循环批量绘制线条:通过循环生成均匀分布的线条,减少重复代码,也便于调整线条数量。

修正后的完整代码

import 'dart:math';
import 'package:flutter/material.dart';

class CurvePainter extends CustomPainter {
  // 角度转弧度工具方法
  double degToRad(num deg) {
    return deg * (pi / 180.0).toDouble();
  }

  @override
  void paint(Canvas canvas, Size size) {
    // 定义线条画笔
    final linePaint = Paint()
      ..color = Colors.white
      ..strokeWidth = 5;

    // 定义圆形填充画笔
    final circlePaint = Paint()
      ..color = const Color(0xff63aa65)
      ..style = PaintingStyle.fill;

    // 统一圆心和圆形半径
    final center = Offset(size.width / 2, size.height / 2);
    const circleRadius = 150.0;

    // 绘制圆形
    canvas.drawCircle(center, circleRadius, circlePaint);

    // 绘制4条均分的直径线(将圆分成8等份)
    const diameterCount = 4;
    // 每条线的角度间隔:360度 / 总份数(4条线对应8个扇形)
    final angleStep = 360 / (diameterCount * 2);

    for (int i = 0; i < diameterCount; i++) {
      final currentAngle = i * angleStep;
      // 直径两端的弧度(相差180度)
      final startRad = degToRad(currentAngle);
      final endRad = degToRad(currentAngle + 180);

      // 计算直径的两个端点坐标
      final startPoint = Offset(
        center.dx + circleRadius * cos(startRad),
        center.dy + circleRadius * sin(startRad),
      );
      final endPoint = Offset(
        center.dx + circleRadius * cos(endRad),
        center.dy + circleRadius * sin(endRad),
      );

      // 绘制单条直径
      canvas.drawLine(startPoint, endPoint, linePaint);
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

调整说明

如果需要将圆形分成4等份(仅两条垂直直径),只需将diameterCount改为2,此时角度间隔会自动变为90度,生成两条垂直的直径线。

内容的提问来源于stack exchange,提问作者Rogerto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:55:23