drawLineCart method

void drawLineCart({
  1. required Canvas canvas,
  2. required int maxLength,
  3. required double strokeWidth,
  4. required Color lineColor,
  5. Shader? chartShader,
})

绘制曲线图

Implementation

void drawLineCart({
  required Canvas canvas,
  required int maxLength,
  required double strokeWidth,
  required Color lineColor,
  Shader? chartShader,
}) {
  if (getValues().isEmpty) {
    return;
  }
  double startX = 0;
  double startY = 0;
  Path? clipPath;
  int length = values.length;
  List<double>? maStartYs;
  if (length >= maxLength) {
    length += 1;
  }
  for (int i = 0; i < length; i++) {
    int index = i;
    if (index == values.length) {
      index--;
    }
    final item = values[index];
    double x = indexToX(i) * scale;
    double y = valueToY(item.close);
    if (i == 0) {
      startX = 0;
      startY = y;
      if (chartShader != null) {
        clipPath ??= Path();
      }
      clipPath?.moveTo(0, canvasHeight);
    }
    clipPath?.lineTo(x, y);

    drawLine(
        canvas: canvas,
        startX: startX,
        startY: startY,
        endX: x,
        endY: y,
        strokeWidth: strokeWidth,
        color: lineColor);

    if (item.mas != null) {
      maStartYs ??= List.filled(item.mas!.length, 0);
      for (int m = 0, len = item.mas!.length; m < len; m++) {
        double ma = item.mas![m];
        if (ma > 0) {
          double my = valueToY(ma);
          if (maStartYs[m] == 0) {
            maStartYs[m] = my;
          }

          drawLine(
              canvas: canvas,
              startX: startX,
              startY: maStartYs[m],
              endX: x,
              endY: my,
              strokeWidth: maStrokeWidth,
              color: maDayColors[m]);
          maStartYs[m] = my;
        }
      }
    }

    /// 绘制最后一个点的 指示器
    if (index == values.length - 1 && values.length < maxLength) {
      canvas.drawCircle(
          Offset(x, y),
          strokeWidth * 2,
          Paint()
            ..color = lineColor
            ..strokeWidth);
    }
    startX = x;
    startY = y;
  }

  /// 绘制阴影
  if (clipPath != null) {
    getValues().reduce(max);
    canvas.save();
    _bezierFillPaint.shader = chartShader;
    clipPath.lineTo(startX, canvasHeight);
    clipPath.close();
    canvas.clipPath(clipPath);

    var rect = Rect.fromLTWH(
      0,
      valueToY(_clipTopValue),
      (values.length * (pointWidth + pointSpace)) * scale,
      canvasHeight,
    );
    canvas.drawRect(rect, _bezierFillPaint);
    canvas.restore();
  }
}