From 0b820ce9ac04b2ad798de61b6bdcaf369430f5b5 Mon Sep 17 00:00:00 2001 From: Frank Pape Date: Tue, 3 Jun 2025 16:53:19 -0400 Subject: [PATCH 1/2] Make stroke caps configurable for radial gauge and radial value bars. --- lib/src/radial_gauge/radial_gauge.dart | 8 ++++++++ .../radial_gauge_container_painter.dart | 2 +- .../radial_gauge/valuebar/radial_value_bar.dart | 10 +++++++++- .../valuebar/radial_value_bar_painter.dart | 14 +++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lib/src/radial_gauge/radial_gauge.dart b/lib/src/radial_gauge/radial_gauge.dart index 5571bb9d..a38ae367 100644 --- a/lib/src/radial_gauge/radial_gauge.dart +++ b/lib/src/radial_gauge/radial_gauge.dart @@ -41,6 +41,7 @@ class RadialGauge extends StatefulWidget { this.shapePointer = const [], this.needlePointer = const [], this.widgetPointer = const [], + this.strokeCap = StrokeCap.round, // List? track, }) : super(key: key); @@ -173,6 +174,13 @@ class RadialGauge extends StatefulWidget { /// final List? valueBar; + /// + /// The stroke cap of the radial gauge container. + /// + /// Defaults to StrokeCap.round. + /// + final StrokeCap strokeCap; + @override State createState() => _RadialGaugeState(); } diff --git a/lib/src/radial_gauge/radial_gauge_container_painter.dart b/lib/src/radial_gauge/radial_gauge_container_painter.dart index 6abc6c9b..53cfe596 100644 --- a/lib/src/radial_gauge/radial_gauge_container_painter.dart +++ b/lib/src/radial_gauge/radial_gauge_container_painter.dart @@ -199,7 +199,7 @@ class RenderRadialGaugeContainer extends RenderBox { final Paint containerPaint = Paint() ..color = getRadialGauge.track.color - ..strokeCap = StrokeCap.round + ..strokeCap = getRadialGauge.strokeCap ..strokeWidth = thickness ..style = PaintingStyle.stroke; diff --git a/lib/src/radial_gauge/valuebar/radial_value_bar.dart b/lib/src/radial_gauge/valuebar/radial_value_bar.dart index 7a4360cc..c67e5d06 100644 --- a/lib/src/radial_gauge/valuebar/radial_value_bar.dart +++ b/lib/src/radial_gauge/valuebar/radial_value_bar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:geekyants_flutter_gauges/geekyants_flutter_gauges.dart'; import 'package:geekyants_flutter_gauges/src/radial_gauge/valuebar/radial_value_bar_painter.dart'; + import '../radial_gauge.dart'; import '../radial_gauge_state.dart'; @@ -36,6 +37,7 @@ class RadialValueBar extends LeafRenderObjectWidget { this.valueBarThickness = 10, this.gradient, this.radialOffset = 0, + this.strokeCap = StrokeCap.round, }) : super(key: key); /// [value] denotes the value of the value bar. @@ -123,6 +125,10 @@ class RadialValueBar extends LeafRenderObjectWidget { /// final LinearGradient? gradient; + /// [strokeCap] denotes the stroke cap of the value bar. + /// + final StrokeCap strokeCap; + @override RenderObject createRenderObject(BuildContext context) { final RadialGaugeState scope = RadialGaugeState.of(context); @@ -133,6 +139,7 @@ class RadialValueBar extends LeafRenderObjectWidget { gradient: gradient ?? LinearGradient(colors: [color, color]), radialOffset: radialOffset, valueBarThickness: valueBarThickness, + strokeCap: strokeCap, radialGauge: scope.rGauge, ); } @@ -147,6 +154,7 @@ class RadialValueBar extends LeafRenderObjectWidget { ..setRadialOffset = radialOffset ..setLinearGradient = gradient ?? LinearGradient(colors: [color, color]) ..setValueBarThickness = valueBarThickness - ..setRadialGauge = scope.rGauge; + ..setRadialGauge = scope.rGauge + ..setStrokeCap = strokeCap; } } diff --git a/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart b/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart index 9ed12bfb..e18e53e4 100644 --- a/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart +++ b/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart @@ -1,5 +1,7 @@ import 'dart:math'; + import 'package:flutter/rendering.dart'; + import '../../../geekyants_flutter_gauges.dart'; class RenderRadialValueBar extends RenderBox { @@ -11,12 +13,14 @@ class RenderRadialValueBar extends RenderBox { required double valueBarThickness, required RadialGauge radialGauge, required double radialOffset, + required StrokeCap strokeCap, }) : _value = value, _color = color, _gradient = gradient!, _radialOffset = radialOffset, _radialGauge = radialGauge, _valueBarThickness = valueBarThickness, + _strokeCap = strokeCap, super(); RadialGauge get getRadialGauge => _radialGauge!; @@ -59,6 +63,14 @@ class RenderRadialValueBar extends RenderBox { markNeedsPaint(); } + StrokeCap get getStrokeCap => _strokeCap; + StrokeCap _strokeCap; + set setStrokeCap(StrokeCap strokeCap) { + if (_strokeCap == strokeCap) return; + _strokeCap = strokeCap; + markNeedsPaint(); + } + LinearGradient get getLinearGradient => _gradient; LinearGradient _gradient; set setLinearGradient(LinearGradient linearGradient) { @@ -107,7 +119,7 @@ class RenderRadialValueBar extends RenderBox { final Paint containerPaint = Paint() ..color = _color - ..strokeCap = StrokeCap.round + ..strokeCap = _strokeCap ..strokeWidth = _valueBarThickness ..shader = gradient.createShader( Rect.fromCircle(center: center, radius: size.shortestSide / 2.0)) From e8c28e4e129dcf750aa9c9e784ec94c59b0c6f47 Mon Sep 17 00:00:00 2001 From: Frank Pape Date: Wed, 16 Jul 2025 11:12:42 -0400 Subject: [PATCH 2/2] Radius should only be reduced by half the track thickness. This was creating the effect of huge unnecessary padding around thicker tracks. --- lib/src/radial_gauge/radial_gauge_container_painter.dart | 2 +- lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/radial_gauge/radial_gauge_container_painter.dart b/lib/src/radial_gauge/radial_gauge_container_painter.dart index 53cfe596..2bc877b3 100644 --- a/lib/src/radial_gauge/radial_gauge_container_painter.dart +++ b/lib/src/radial_gauge/radial_gauge_container_painter.dart @@ -192,7 +192,7 @@ class RenderRadialGaugeContainer extends RenderBox { // double radialOffset = getRadialGauge.valueBar!.first.radialOffset; double partAngle = arcLength / numParts; // angle of each part in radians - double radius = (shortestSide / 2 - thickness) * + double radius = (shortestSide / 2.0 - thickness / 2.0) * getRadialGauge.radiusFactor; // radius of the arc final center = offset; diff --git a/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart b/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart index e18e53e4..54f69d9c 100644 --- a/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart +++ b/lib/src/radial_gauge/valuebar/radial_value_bar_painter.dart @@ -128,7 +128,7 @@ class RenderRadialValueBar extends RenderBox { double arcLength = endAngle - startAngle; double shortestSide = size.shortestSide; double radius = (shortestSide / 2.0 - - getRadialGauge.track.thickness - + getRadialGauge.track.thickness / 2.0 - getRadialOffset) * getRadialGauge.radiusFactor;