drawTouchedSpotsIndicator method
void
drawTouchedSpotsIndicator(
- CanvasWrapper canvasWrapper,
- List<
LineIndexDrawingInfo> lineIndexDrawingInfo, - PaintHolder<
LineChartData> holder
Implementation
@visibleForTesting
void drawTouchedSpotsIndicator(
CanvasWrapper canvasWrapper,
List<LineIndexDrawingInfo> lineIndexDrawingInfo,
PaintHolder<LineChartData> holder,
) {
if (lineIndexDrawingInfo.isEmpty) {
return;
}
final viewSize = canvasWrapper.size;
lineIndexDrawingInfo.sort((a, b) => b.spot.y.compareTo(a.spot.y));
for (final info in lineIndexDrawingInfo) {
final barData = info.line;
final barXDelta = getBarLineXLength(barData, viewSize, holder);
final data = holder.data;
final index = info.spotIndex;
final spot = info.spot;
final indicatorData = info.indicatorData;
final touchedSpot = Offset(
getPixelX(spot.x, viewSize, holder),
getPixelY(spot.y, viewSize, holder),
);
/// For drawing the dot
final showingDots = indicatorData.touchedSpotDotData.show;
var dotHeight = 0.0;
late FlDotPainter dotPainter;
if (showingDots) {
final xPercentInLine = (touchedSpot.dx / barXDelta) * 100;
dotPainter = indicatorData.touchedSpotDotData
.getDotPainter(spot, xPercentInLine, barData, index);
dotHeight = dotPainter.getSize(spot).height;
}
/// For drawing the indicator line
final lineStartY = min(
data.maxY,
max(data.minY, data.lineTouchData.getTouchLineStart(barData, index)),
);
final lineEndY = min(
data.maxY,
max(data.minY, data.lineTouchData.getTouchLineEnd(barData, index)),
);
final lineStart =
Offset(touchedSpot.dx, getPixelY(lineStartY, viewSize, holder));
var lineEnd =
Offset(touchedSpot.dx, getPixelY(lineEndY, viewSize, holder));
/// If line end is inside the dot, adjust it so that it doesn't overlap with the dot.
final dotMinY = touchedSpot.dy - dotHeight / 2;
final dotMaxY = touchedSpot.dy + dotHeight / 2;
if (lineEnd.dy > dotMinY && lineEnd.dy < dotMaxY) {
if (lineStart.dy < lineEnd.dy) {
lineEnd -= Offset(0, lineEnd.dy - dotMinY);
} else {
lineEnd += Offset(0, dotMaxY - lineEnd.dy);
}
}
_touchLinePaint
..color = indicatorData.indicatorBelowLine.color
..strokeWidth = indicatorData.indicatorBelowLine.strokeWidth
..transparentIfWidthIsZero();
canvasWrapper.drawDashedLine(
lineStart,
lineEnd,
_touchLinePaint,
indicatorData.indicatorBelowLine.dashArray,
);
/// Draw the indicator dot
if (showingDots) {
canvasWrapper.drawDot(dotPainter, spot, touchedSpot);
}
}
}