drawHorizontalAxesLabels method
void
drawHorizontalAxesLabels(
- Canvas canvas,
- ChartAxisRenderer axisRenderer,
- SfCartesianChart chart, [
- String? renderType,
- double? animationFactor,
- ChartAxisRenderer? oldAxisRenderer,
- bool? needAnimate,
To draw the axis labels of horizontal axes
Implementation
@override
void drawHorizontalAxesLabels(
Canvas canvas, ChartAxisRenderer axisRenderer, SfCartesianChart chart,
[String? renderType,
double? animationFactor,
ChartAxisRenderer? oldAxisRenderer,
bool? needAnimate]) {
final ChartAxis axis = axisRenderer._axis;
if (renderType == axis.labelPosition.toString().split('.')[1]) {
final Rect axisBounds = axisRenderer._bounds;
int angle;
TextStyle textStyle;
final List<AxisLabel> visibleLabels = axisRenderer._visibleLabels;
late double tempInterval, pointX, pointY, previousLabelEnd;
for (int i = 0; i < visibleLabels.length; i++) {
final AxisLabel label = visibleLabels[i];
final String labelText =
axisRenderer.getAxisLabel(axis, label.renderText!, i);
textStyle = label.labelStyle;
textStyle = _getTextStyle(
textStyle: textStyle,
fontColor:
textStyle.color ?? _chartState._chartTheme.axisLabelColor);
tempInterval = label.value.toDouble();
angle = axisRenderer.getAxisLabelAngle(axisRenderer, labelText, i);
/// For negative angle calculations
if (angle.isNegative) {
angle = angle + 360;
}
axisRenderer._labelRotation = angle;
final Size textSize = measureText(labelText, textStyle);
final Size rotatedTextSize = measureText(labelText, textStyle, angle);
pointX = ((_valueToCoefficient(tempInterval, axisRenderer) *
axisBounds.width) +
axisBounds.left)
.roundToDouble();
pointY = _getPointY(axisRenderer, label, axisBounds);
pointY -= angle == 0 ? textSize.height / 2 : 0;
pointY += rotatedTextSize.height / 2;
pointX -= angle == 0 ? textSize.width / 2 : 0;
/// Edge label placement - shift for x-Axis
pointX = _getShiftedPosition(
axisRenderer, axisBounds, pointX, pointY, textSize, i);
if (axis.labelAlignment == LabelAlignment.end) {
pointX = pointX + textSize.height / 2;
} else if (axis.labelAlignment == LabelAlignment.start) {
pointX = pointX - textSize.height / 2;
}
if (axis.edgeLabelPlacement == EdgeLabelPlacement.hide) {
if (axis.labelAlignment == LabelAlignment.center) {
if (i == 0 || (i == axisRenderer._visibleLabels.length - 1)) {
axisRenderer._visibleLabels[i]._needRender = false;
continue;
}
} else if ((axis.labelAlignment == LabelAlignment.end) &&
(i == axisRenderer._visibleLabels.length - 1 ||
(i == 0 && axis.isInversed))) {
axisRenderer._visibleLabels[i]._needRender = false;
continue;
} else if ((axis.labelAlignment == LabelAlignment.start) &&
(i == 0 ||
(i == axisRenderer._visibleLabels.length - 1 &&
axis.isInversed))) {
axisRenderer._visibleLabels[i]._needRender = false;
continue;
}
}
if (axis.labelIntersectAction == AxisLabelIntersectAction.hide &&
axis.labelRotation % 180 == 0 &&
i != 0 &&
axisRenderer._visibleLabels[i - 1]._needRender &&
(!axis.isInversed
? pointX <= previousLabelEnd
: (pointX + textSize.width) >= previousLabelEnd)) {
continue;
}
previousLabelEnd = axis.isInversed ? pointX : pointX + textSize.width;
if (needAnimate!) {
final double? oldLocation = _getPrevLocation(
axisRenderer, oldAxisRenderer!, tempInterval, textSize, angle);
pointX = oldLocation != null
? (oldLocation - (oldLocation - pointX) * animationFactor!)
: pointX;
}
final Offset point = Offset(pointX, pointY);
if (axisBounds.left - textSize.width <= pointX &&
axisBounds.right + textSize.width >= pointX) {
_drawText(canvas, labelText, point, textStyle, angle);
}
if (label._labelCollection != null &&
label._labelCollection!.isNotEmpty &&
axis.labelIntersectAction == AxisLabelIntersectAction.wrap) {
for (int j = 1; j < label._labelCollection!.length; j++) {
final String wrapTxt = label._labelCollection![j];
_drawText(
canvas,
wrapTxt,
Offset(
pointX,
pointY +
(j *
measureText(wrapTxt, axis.labelStyle, angle)
.height)),
textStyle,
angle);
}
}
}
}
}