drawCoordinateAxis static method

void drawCoordinateAxis(
  1. Canvas canvas,
  2. CoordinateAxisModel coordinateAxisModel
)

Implementation

static void drawCoordinateAxis(
  Canvas canvas,
  CoordinateAxisModel coordinateAxisModel,
) {
  var paint = Paint()
    ..isAntiAlias = true
    ..strokeWidth = 1
    ..strokeCap = StrokeCap.round
    ..style = PaintingStyle.stroke;
  var _startY = coordinateAxisModel.baseBean.basePadding.top +
      coordinateAxisModel.fixedHeight;
  var _endX = coordinateAxisModel.baseBean.basePadding.left +
      coordinateAxisModel.fixedWidth;
  canvas.drawLine(
      Offset(coordinateAxisModel.baseBean.basePadding.left, _startY),
      Offset(_endX + overPadding, _startY),
      paint
        ..color = coordinateAxisModel.baseBean.xColor
        ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth); //x轴
  canvas.drawLine(
      Offset(coordinateAxisModel.baseBean.basePadding.left, _startY),
      Offset(coordinateAxisModel.baseBean.basePadding.left,
          coordinateAxisModel.baseBean.basePadding.top - overPadding),
      paint
        ..color = coordinateAxisModel.baseBean.yColor
        ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth); //y轴
  if (coordinateAxisModel.baseBean.unitX != null) {
    //绘制x轴单位内容
    var model = coordinateAxisModel.baseBean.unitX!;
    var tp = TextPainter(
        textAlign: TextAlign.center,
        ellipsis: '.',
        text: TextSpan(text: model.text, style: model.textStyle),
        textDirection: TextDirection.ltr)
      ..layout();
    tp.paint(
      canvas,
      Offset(
          _endX + overPadding + model.offset.dx, _startY + model.offset.dy),
    );
  }
  if (coordinateAxisModel.baseBean.unitY != null) {
    //绘制y轴单位内容
    var model = coordinateAxisModel.baseBean.unitY!;
    var tp = TextPainter(
        textAlign: TextAlign.center,
        ellipsis: '.',
        text: TextSpan(text: model.text, style: model.textStyle),
        textDirection: TextDirection.ltr)
      ..layout();
    tp.paint(
      canvas,
      Offset(
          coordinateAxisModel.baseBean.basePadding.left -
              model.offset.dx -
              tp.width,
          coordinateAxisModel.baseBean.basePadding.top -
              overPadding -
              model.offset.dy -
              tp.height),
    );
  }
  var showX = true;
  var showY = true;
  switch (coordinateAxisModel.xyCoordinate) {
    case XYCoordinate.All:
      showX = true;
      showY = true;
      break;
    case XYCoordinate.OnlyX:
      showX = true;
      showY = false;
      break;
    case XYCoordinate.OnlyY:
      showX = false;
      showY = true;
      break;
    default:
  }
  if (showX) {
    if (coordinateAxisModel.baseBean.isShowBorderRight) {
      ///最右侧垂直边界线
      canvas.drawLine(
          Offset(_endX, _startY),
          Offset(_endX, coordinateAxisModel.baseBean.basePadding.top),
          paint
            ..color = coordinateAxisModel.baseBean.yColor
            ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
    }
    for (var i = 0; i < coordinateAxisModel.xDialValues.length; i++) {
      var tempXDigalModel = coordinateAxisModel.xDialValues[i];
      var dw = 0.0;
      if (tempXDigalModel.positionRetioy != null) {
        dw = (coordinateAxisModel.fixedWidth -
                2 * coordinateAxisModel.bothEndPitchX) *
            tempXDigalModel.positionRetioy!; //两个点之间的x方向距离
      }
      if (coordinateAxisModel.baseBean.isShowX) {
        ///绘制x轴文本
        var tpx = TextPainter(
            textAlign: TextAlign.center,
            ellipsis: '.',
            text: TextSpan(
                text: tempXDigalModel.title,
                style: tempXDigalModel.titleStyle),
            textDirection: TextDirection.ltr)
          ..layout();
        //绘制文案在底部bottom内部居中显示
        var transitHeight = max(
            (coordinateAxisModel.baseBean.basePadding.bottom - tpx.height) /
                2.0,
            0.0);
        tpx.paint(
            canvas,
            Offset(
                coordinateAxisModel.baseBean.basePadding.left +
                    dw +
                    coordinateAxisModel.bothEndPitchX -
                    tpx.width / 2,
                _startY + transitHeight));
      }
      if (coordinateAxisModel.baseBean.isShowHintY && i != 0) {
        //y轴辅助线
        var hitYPath = Path();
        hitYPath
          ..moveTo(
              coordinateAxisModel.baseBean.basePadding.left +
                  dw +
                  coordinateAxisModel.bothEndPitchX,
              _startY)
          ..lineTo(
              coordinateAxisModel.baseBean.basePadding.left +
                  dw +
                  coordinateAxisModel.bothEndPitchX,
              coordinateAxisModel.baseBean.basePadding.top - overPadding);
        if (coordinateAxisModel.baseBean.isHintLineImaginary) {
          canvas.drawPath(
            dashPath(
              hitYPath,
              dashArray: CircularIntervalList<double>(<double>[5.0, 4.0]),
            ),
            paint
              ..color = coordinateAxisModel.baseBean.hintLineColor
              ..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth,
          );
        } else {
          canvas.drawPath(
              hitYPath,
              paint
                ..color = coordinateAxisModel.baseBean.hintLineColor
                ..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
        }
      }
      if (coordinateAxisModel.baseBean.isShowXScale) {
        ///x轴刻度
        canvas.drawLine(
            Offset(
                coordinateAxisModel.baseBean.basePadding.left +
                    dw +
                    coordinateAxisModel.bothEndPitchX,
                _startY),
            Offset(
                coordinateAxisModel.baseBean.basePadding.left +
                    dw +
                    coordinateAxisModel.bothEndPitchX,
                _startY - coordinateAxisModel.baseBean.rulerWidth),
            paint
              ..color = coordinateAxisModel.baseBean.xColor
              ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
      }
    }
  }

  if (showY) {
    if (coordinateAxisModel.baseBean.isShowBorderTop) {
      ///最顶部水平边界线
      canvas.drawLine(
          Offset(coordinateAxisModel.baseBean.basePadding.left,
              coordinateAxisModel.baseBean.basePadding.top),
          Offset(_endX, coordinateAxisModel.baseBean.basePadding.top),
          paint
            ..color = coordinateAxisModel.baseBean.xColor
            ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
    }
    if (coordinateAxisModel.baseBean.yDialValues.isNotEmpty) {
      for (var i = 0;
          i < coordinateAxisModel.baseBean.yDialValues.length;
          i++) {
        var tempYModel = coordinateAxisModel.baseBean.yDialValues[i];

        ///绘制y轴文本
        var yValue = tempYModel.title;
        var yLength =
            tempYModel.positionRetioy * coordinateAxisModel.fixedHeight;
        var tpY = TextPainter(
            textAlign: TextAlign.right,
            ellipsis: '.',
            maxLines: 1,
            text: TextSpan(text: '$yValue', style: tempYModel.titleStyle),
            textDirection: TextDirection.rtl)
          ..layout();
        tpY.paint(
            canvas,
            Offset(
                coordinateAxisModel.baseBean.isLeftYDial
                    ? (coordinateAxisModel.baseBean.basePadding.left -
                        10 -
                        tpY.width)
                    : _endX + 8,
                _startY - yLength - tpY.height / 2));
        var nextLength = ((i ==
                    coordinateAxisModel.baseBean.yDialValues.length - 1)
                ? 0.0
                //放到最后一个,无论是哪里,都是和最后一个0的比较
                // coordinateAxisModel.baseBean.yDialValues.last.positionRetioy
                : coordinateAxisModel
                    .baseBean.yDialValues[i + 1].positionRetioy) *
            coordinateAxisModel.fixedHeight;
        var subLength = (yLength + nextLength) / 2;
        var tpSub = TextPainter(
            textAlign: TextAlign.center,
            ellipsis: '.',
            maxLines: 5,
            text: TextSpan(
                text: tempYModel.centerSubTitle,
                style: tempYModel.centerSubTextStyle),
            textDirection: TextDirection.ltr)
          ..layout();
        tpSub.paint(
            canvas,
            Offset(
                coordinateAxisModel.baseBean.isLeftYDialSub
                    ? (coordinateAxisModel.baseBean.basePadding.left -
                        tpSub.width -
                        10)
                    : (_endX + 8),
                _startY - subLength - tpSub.height / 2));

        if (coordinateAxisModel.baseBean.isShowHintX && yLength != 0) {
          //x轴辅助线
          var hitXPath = Path();
          hitXPath
            ..moveTo(coordinateAxisModel.baseBean.basePadding.left,
                _startY - yLength)
            ..lineTo(_endX + overPadding, _startY - yLength);
          if (coordinateAxisModel.baseBean.isHintLineImaginary) {
            canvas.drawPath(
                dashPath(
                  hitXPath,
                  dashArray: CircularIntervalList<double>(<double>[5.0, 4.0]),
                ),
                paint
                  ..color = tempYModel.hintLineColor ??
                      coordinateAxisModel.baseBean.hintLineColor
                  ..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
          } else {
            canvas.drawPath(
                hitXPath,
                paint
                  ..color = tempYModel.hintLineColor ??
                      coordinateAxisModel.baseBean.hintLineColor
                  ..strokeWidth = coordinateAxisModel.baseBean.hintLineWidth);
          }
        }
        if (coordinateAxisModel.baseBean.isShowYScale) {
          ///y轴刻度
          canvas.drawLine(
              Offset(coordinateAxisModel.baseBean.basePadding.left,
                  _startY - yLength),
              Offset(
                  coordinateAxisModel.baseBean.basePadding.left +
                      coordinateAxisModel.baseBean.rulerWidth,
                  _startY - yLength),
              paint
                ..color = coordinateAxisModel.baseBean.yColor
                ..strokeWidth = coordinateAxisModel.baseBean.xyLineWidth);
        }
      }
    }
  }
}