Flutter:如何在SfRadialGauge信用分仪表盘顶部添加半圆
Syncfusion Flutter 仪表盘添加外层半圆实现方案
基于你引入的syncfusion_flutter_gauges: ^20.1.59版本,可通过以下两种方案快速实现目标效果中外层的浅灰色细半圆,无需引入其他依赖。
方案1:多RadialAxis叠加实现(改动最小,优先推荐)
SfRadialGauge支持同时配置多个径向轴,直接在现有渐变轴外层叠加一个浅灰色细线条轴即可,和原控件适配度最高,不需要自行处理弧度、屏幕适配问题。
直接替换原有CreditScoreGauge代码即可运行:
import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; class CreditScoreGauge extends StatelessWidget { const CreditScoreGauge({super.key, this.creditScore = 600}); final double creditScore; @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.all(20), child: SfRadialGauge( axes: <RadialAxis>[ // 外层浅灰色细半圆 RadialAxis( showLabels: false, showTicks: false, minimum: 300, maximum: 850, startAngle: 180, endAngle: 0, radiusFactor: 0.97, axisLineStyle: const AxisLineStyle( thickness: 0.03, cornerStyle: CornerStyle.bothCurve, thicknessUnit: GaugeSizeUnit.factor, color: Color(0xffE5E7EB), ), ), // 原有渐变进度轴 RadialAxis( showLabels: false, showTicks: false, minimum: 300, maximum: 850, startAngle: 180, endAngle: 0, radiusFactor: 0.9, axisLineStyle: const AxisLineStyle( thickness: 0.12, cornerStyle: CornerStyle.bothCurve, thicknessUnit: GaugeSizeUnit.factor, gradient: SweepGradient(colors: <Color>[ Color(0xffa2c9e1), Color(0xff62769D), Color(0xff354F81), Color(0Xff1B3568), Color(0xff122345), ], stops: <double>[ 0, 0.35, 0.7, 0.8, 1.0 ]), ), pointers: <GaugePointer>[ MarkerPointer( value: creditScore, markerHeight: 25, markerWidth: 25, markerType: MarkerType.circle, enableDragging: true, color: const Color.fromARGB(0, 3, 168, 244), borderWidth: 7, elevation: 10, borderColor: Colors.white), ], ), ], ), ); } }
核心参数调整说明
- 外层灰轴设置更大的
radiusFactor,保证显示在渐变弧上方 - 两层轴的角度范围(
startAngle/endAngle)、极值(minimum/maximum)完全一致,保证弧度对齐 - 可通过微调
radiusFactor、thickness参数,调整两层弧的间距和线条粗细,匹配设计稿要求
方案2:Stack+CustomPaint 自定义绘制(灵活度最高)
如果后续需要在外层半圆上增加刻度、分段色标等自定义元素,可通过Stack组件叠一层自定义绘制的半圆,可控性更强:
@override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.all(20), child: Stack( alignment: Alignment.center, children: [ // 外层浅灰半圆 CustomPaint( size: const Size(300, 150), painter: const _TopArcPainter(), ), // 原有渐变仪表盘,radiusFactor调整为0.85避免和外层弧重叠 SfRadialGauge( axes: <RadialAxis>[ RadialAxis( showLabels: false, showTicks: false, minimum: 300, maximum: 850, startAngle: 180, endAngle: 0, radiusFactor: 0.85, // 此处保留你原有axisLineStyle、pointers的全部配置 ) ], ) ], ), ); } class _TopArcPainter extends CustomPainter { const _TopArcPainter(); @override void paint(Canvas canvas, Size size) { final arcPaint = Paint() ..color = const Color(0xffE5E7EB) ..strokeWidth = 4 ..style = PaintingStyle.stroke ..strokeCap = StrokeCap.round; canvas.drawArc( Rect.fromLTWH(0, 0, size.width, size.height * 2), 3.14159, // 180度(弧度制) 3.14159, // 扫过180度形成半圆 false, arcPaint, ); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; }
效果参考
- 当前实现效果:

- 目标预期效果:

内容的提问来源于stack exchange,提问作者noosh
相关产品推荐
相关产品推荐

