draw method
void
draw(
- Canvas canvas,
- ChartPainterData painterData,
- ChartTouchCallbackData touchedData,
- double tolerance,
override
Draw tooltip line shape.
Implementation
@override
void draw(Canvas canvas, ChartPainterData painterData,
ChartTouchCallbackData touchedData, double tolerance) {
final T item = touchedData.selectedItem as T;
final Offset currentValuePos = currentPos(item);
final Offset itemPos = Offset(currentValuePos.dx, currentValuePos.dy);
final TextPainter textPainter = TextPainter(
text: TextSpan(
text: onTextValue(item),
style: textStyle,
),
textDirection: TextDirection.ltr,
)..layout();
final Offset pos = Offset(
itemPos.dx - textPainter.width / 2.0,
itemPos.dy -
textPainter.height -
padding.vertical / 2.0 -
(marginBottom + circleBorderThickness + circleSize) -
triangleSideLength * 0.5,
);
final Offset rectPos = Offset(
pos.dx - padding.horizontal / 2.0,
pos.dy - padding.vertical / 2.0,
);
final Size rectSize = Size(
textPainter.width + padding.horizontal,
textPainter.height + padding.vertical,
);
final Offset offsetRectAndText = Offset(
painterData.position.dx - tolerance > rectPos.dx
? -(painterData.position.dx - tolerance - rectPos.dx)
: painterData.position.dx + tolerance + painterData.size.width <
rectPos.dx + rectSize.width
? -(painterData.position.dx +
painterData.size.width +
tolerance -
rectPos.dx -
rectSize.width)
: 0.0,
rectPos.dy < 0.0
? rectPos.dy -
currentValuePos.dy -
(marginBottom + circleBorderThickness + circleSize) -
triangleSideLength * 0.5
: 0.0,
);
final Path rectanglePath = Path()
..addRRect(
RRect.fromRectAndRadius(
Offset(rectPos.dx - offsetRectAndText.dx,
rectPos.dy - offsetRectAndText.dy) &
rectSize,
Radius.circular(radius),
),
);
final Offset triangleCenterPos = Offset(
rectPos.dx + rectSize.width / 2.0,
rectPos.dy + rectSize.height - offsetRectAndText.dy,
);
final Path trianglePath = Path();
if (rectPos.dy < 0.0) {
trianglePath
..moveTo(
triangleCenterPos.dx - triangleSideLength / 2.0,
triangleCenterPos.dy - rectSize.height + 1.0,
)
..lineTo(
triangleCenterPos.dx + triangleSideLength / 2.0,
triangleCenterPos.dy - rectSize.height + 1.0,
)
..lineTo(
triangleCenterPos.dx,
triangleCenterPos.dy -
rectSize.height -
triangleSideLength * 0.5 +
1.0,
)
..close();
} else {
trianglePath
..moveTo(
triangleCenterPos.dx - triangleSideLength / 2.0,
triangleCenterPos.dy - 1.0,
)
..lineTo(
triangleCenterPos.dx + triangleSideLength / 2.0,
triangleCenterPos.dy - 1.0,
)
..lineTo(
triangleCenterPos.dx,
triangleCenterPos.dy + triangleSideLength * 0.5 - 1.0,
)
..close();
}
canvas
..drawPath(
rectanglePath,
Paint()..color = backgroundColor,
)
..drawPath(
trianglePath,
Paint()..color = backgroundColor,
);
textPainter.paint(
canvas,
Offset(
pos.dx - offsetRectAndText.dx,
pos.dy - offsetRectAndText.dy,
),
);
canvas
..drawCircle(
currentValuePos,
circleSize + circleBorderThickness,
Paint()..color = circleBorderColor,
)
..drawCircle(
currentValuePos,
circleSize,
Paint()..color = circleBackgroundColor,
);
}