drawHorizontalAxesLabels method

  1. @override
void drawHorizontalAxesLabels(
  1. Canvas canvas,
  2. ChartAxisRenderer axisRenderer,
  3. SfCartesianChart chart, [
  4. String? renderType,
  5. double? animationFactor,
  6. ChartAxisRenderer? oldAxisRenderer,
  7. 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);
        }
      }
    }
  }
}