Skip to content

Commit c116467

Browse files
authored
Merge pull request #270 from Afroz-Shaikh/fix/plain-needle-hittest-area
Fix : HitTest Area fix for Plain Needle
2 parents afbed78 + 9d27bff commit c116467

File tree

3 files changed

+38
-36
lines changed

3 files changed

+38
-36
lines changed

lib/src/radial_gauge/pointer/needle_pointer_painter.dart

+20-26
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class RenderNeedlePointer extends RenderBox {
144144
@override
145145
bool hitTestSelf(Offset position) {
146146
Offset calulatedPosition = localToGlobal(position);
147+
147148
if (needlePointerRect.contains(calulatedPosition)) {
148149
return true;
149150
} else if (needlePointerRect.contains(position)) {
@@ -156,7 +157,6 @@ class RenderNeedlePointer extends RenderBox {
156157

157158
@override
158159
void performLayout() {
159-
// size = Size(_needleWidth + _tailRadius, _needleHeight);
160160
size = Size(constraints.maxWidth, constraints.maxHeight);
161161
}
162162

@@ -227,8 +227,25 @@ class RenderNeedlePointer extends RenderBox {
227227

228228
needlePath.close();
229229

230-
needlePointerRect = needlePath;
231-
// canvas.drawPath(needlePath, Paint()..color = Colors.green);
230+
final hitTestWidth = _needleWidth;
231+
232+
final dx = needleEndX - needleStartX;
233+
final dy = needleEndY - needleStartY;
234+
235+
final norm = sqrt(dx * dx + dy * dy);
236+
final perpX = -dy / norm * hitTestWidth / 2;
237+
final perpY = dx / norm * hitTestWidth / 2;
238+
239+
final hitTestPath = Path()
240+
..moveTo(needleStartX + perpX, needleStartY + perpY)
241+
..lineTo(needleEndX + perpX, needleEndY + perpY)
242+
..lineTo(needleEndX - perpX, needleEndY - perpY)
243+
..lineTo(needleStartX - perpX, needleStartY - perpY)
244+
..close();
245+
246+
needlePointerRect =
247+
_needleStyle == NeedleStyle.gaugeNeedle ? needlePath : hitTestPath;
248+
232249
// Needle Pointer paint
233250
if (getNeedleStyle == NeedleStyle.gaugeNeedle) {
234251
canvas.drawPath(needlePath, needlePaint);
@@ -247,26 +264,3 @@ class RenderNeedlePointer extends RenderBox {
247264
return newValue;
248265
}
249266
}
250-
251-
// @override
252-
// void applyPaintTransform(RenderBox child, Matrix4 transform) {
253-
// if (child is RenderNeedlePointer) {
254-
// final centerX = size.width / 2;
255-
// final centerY = size.height / 2;
256-
257-
// transform.translate(centerX, centerY);
258-
// double value = calculateValueAngle(
259-
// child.getValue, getRadialGauge.track.start, getRadialGauge.track.end);
260-
// double startAngle = (getRadialGauge.track.startAngle - 180) * (pi / 180);
261-
// double endAngle = (getRadialGauge.track.endAngle - 180) * (pi / 180);
262-
// double angle = startAngle + (value / 100) * (endAngle - startAngle);
263-
// double toRotateAngle = angle - (pi / 2);
264-
// transform.rotateZ(toRotateAngle); // Specify the rotation in radians
265-
// transform.translate(
266-
// -centerX - child.getNeedleWidth / 2 - child.getTailRadius / 2,
267-
// -centerY - child.getNeedleHeight + child.getTailRadius / 2);
268-
269-
// super.applyPaintTransform(child, transform);
270-
// markNeedsLayout();
271-
// }
272-
// }

lib/src/radial_gauge/pointer/radial_widget_painter.dart

+17-9
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,33 @@ class RenderRadialWidgetPointer extends RenderProxyBox {
6969
void paint(PaintingContext context, Offset offset) {
7070
double gaugeStart = _radialGauge.track.start;
7171
double gaugeEnd = _radialGauge.track.end;
72+
double containerWidth = constraints.maxWidth;
73+
double containerHeight = constraints.maxHeight;
74+
double containerShortestSide = min(containerWidth, containerHeight);
75+
76+
final childSize = child?.computeDryLayout(constraints);
77+
final childOffsetX = (childSize?.width ?? 0.0) / 2;
78+
final childOffsetY = (childSize?.height ?? 0.0) / 2;
7279

73-
// final center = Offset(offset.dx, offset.dy);
7480
final center = Offset(
75-
1440 * _radialGauge.xCenterCoordinate -
76-
2 * _radialGauge.track.thickness,
77-
900 * _radialGauge.yCenterCoordinate - _radialGauge.track.thickness);
81+
containerWidth * _radialGauge.xCenterCoordinate + offset.dx,
82+
containerHeight * _radialGauge.yCenterCoordinate + offset.dy);
83+
7884
double value = calculateValueAngle(_value, gaugeStart, gaugeEnd);
7985
double startAngle = (_radialGauge.track.startAngle - 180) * (pi / 180);
8086
double endAngle = (_radialGauge.track.endAngle - 180) * (pi / 180);
8187

8288
final double angle = startAngle + (value / 100) * (endAngle - startAngle);
8389

8490
double circlePointerOffset =
85-
(900 / 2 - _radialGauge.track.thickness) * _radialGauge.radiusFactor;
91+
(containerShortestSide / 2 - _radialGauge.track.thickness) *
92+
_radialGauge.radiusFactor;
93+
94+
double circlePointerEndX =
95+
center.dx + circlePointerOffset * cos(angle) - childOffsetX;
96+
double circlePointerEndY =
97+
center.dy + circlePointerOffset * sin(angle) - childOffsetY;
8698

87-
double circlePointerEndX = center.dx + circlePointerOffset * cos(angle);
88-
double circlePointerEndY = center.dy + circlePointerOffset * sin(angle);
89-
// canvas.drawCircle(Offset(circlePointerEndX, circlePointerEndY), 30,
90-
// Paint()..color = Colors.red);
9199
super.paint(context, Offset(circlePointerEndX, circlePointerEndY));
92100
}
93101

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: geekyants_flutter_gauges
22
description: A linear gauge package for Flutter that displays progress
33
and can be customized for appearance and behavior.
4-
version: 1.0.3
4+
version: 1.0.4
55
homepage: https://github.com/GeekyAnts/GaugesFlutter
66

77
environment:

0 commit comments

Comments
 (0)