drawChart method

  1. @override
void drawChart(
  1. KLineEntity lastPoint,
  2. KLineEntity curPoint,
  3. double lastX,
  4. double curX,
  5. Size size,
  6. Canvas canvas,
)
override

Implementation

@override
void drawChart(KLineEntity lastPoint, KLineEntity curPoint, double lastX,
    double curX, Size size, Canvas canvas) {
  switch (state) {
    case SecondaryState.VOLATILITY:
      drawLine(lastPoint.volIndicator, curPoint.volIndicator, canvas, lastX,
          curX, chartColors.volIndicatorColor);
      break;

    case SecondaryState.ENVELOPES:
      // 中轨
      drawLine(lastPoint.envMid, curPoint.envMid, canvas, lastX, curX,
          chartColors.envMidColor);
      // 上轨
      drawLine(lastPoint.envUp, curPoint.envUp, canvas, lastX, curX,
          chartColors.envUpColor);
      // 下轨
      drawLine(lastPoint.envDn, curPoint.envDn, canvas, lastX, curX,
          chartColors.envDnColor);
      break;

    case SecondaryState.MFI:
      drawLine(lastPoint.mfi, curPoint.mfi, canvas, lastX, curX,
          chartColors.mfiColor);
      break;

    case SecondaryState.MOMENTUM:
      drawLine(lastPoint.momentum, curPoint.momentum, canvas, lastX, curX,
          chartColors.momentumColor);
      break;

    case SecondaryState.DEMARKER:
      drawLine(lastPoint.dem, curPoint.dem, canvas, lastX, curX,
          chartColors.demColor);
      break;

    case SecondaryState.WPR:
      // 只是一条线
      drawLine(lastPoint.wpr, curPoint.wpr, canvas, lastX, curX,
          chartColors.wprColor);
      break;

    case SecondaryState.STOCHASTIC:
      // 画 %K
      drawLine(lastPoint.stochK, curPoint.stochK, canvas, lastX, curX,
          chartColors.stochKColor);

      // 画 %D
      drawLine(lastPoint.stochD, curPoint.stochD, canvas, lastX, curX,
          chartColors.stochDColor);
      break;

    case SecondaryState.STDDEV:
      drawLine(lastPoint.stdDev, curPoint.stdDev, canvas, lastX, curX,
          chartColors.stdDevColor);
      break;

    case SecondaryState.ADX:
      drawLine(lastPoint.adx, curPoint.adx, canvas, lastX, curX,
          chartColors.adxColor);
      break;

    case SecondaryState.VIX:
      drawLine(lastPoint.vix, curPoint.vix, canvas, lastX, curX,
          chartColors.vixColor);
      break;

    case SecondaryState.ADL:
      drawLine(lastPoint.adl, curPoint.adl, canvas, lastX, curX,
          chartColors.adlColor);
      break;

    case SecondaryState.OBV:
      // 画OBV原始线
      drawLine(lastPoint.obv, curPoint.obv, canvas, lastX, curX,
          chartColors.obvColor);

      // 画OBV平滑线
      drawLine(lastPoint.obvEma, curPoint.obvEma, canvas, lastX, curX,
          chartColors.obvEmaColor);
      break;

    case SecondaryState.VWAP:
      drawLine(lastPoint.vwap, curPoint.vwap, canvas, lastX, curX,
          chartColors.vwapColor);
      break;

    case SecondaryState.HV:
      drawLine(lastPoint.hv, curPoint.hv, canvas, lastX, curX,
          chartColors.hvColor);
      break;

    case SecondaryState.ATR:
      drawLine(lastPoint.atr, curPoint.atr, canvas, lastX, curX,
          chartColors.atrColor);
      break;

    case SecondaryState.SUPER_TREND:
      final double? dir =
          curPoint.superTrendDirection ?? lastPoint.superTrendDirection;
      final Color trendColor = (dir ?? 1.0) >= 0
          ? chartColors.superTrendUpColor
          : chartColors.superTrendDownColor;
      drawLine(lastPoint.superTrend, curPoint.superTrend, canvas, lastX, curX,
          trendColor);
      drawLine(lastPoint.superTrendUpper, curPoint.superTrendUpper, canvas,
          lastX, curX, chartColors.superTrendUpperColor);
      drawLine(lastPoint.superTrendLower, curPoint.superTrendLower, canvas,
          lastX, curX, chartColors.superTrendLowerColor);
      break;

    case SecondaryState.STC:
      drawLine(lastPoint.stc, curPoint.stc, canvas, lastX, curX,
          chartColors.stcColor);
      break;

    case SecondaryState.QQE:
      drawLine(lastPoint.qqe, curPoint.qqe, canvas, lastX, curX,
          chartColors.qqeColor);
      drawLine(lastPoint.qqeSignal, curPoint.qqeSignal, canvas, lastX, curX,
          chartColors.qqeSignalColor);
      break;

    case SecondaryState.WAVE_TREND:
      drawLine(lastPoint.waveTrend1, curPoint.waveTrend1, canvas, lastX, curX,
          chartColors.waveTrend1Color);
      drawLine(lastPoint.waveTrend2, curPoint.waveTrend2, canvas, lastX, curX,
          chartColors.waveTrend2Color);
      break;

    case SecondaryState.CMO:
      drawLine(lastPoint.cmo, curPoint.cmo, canvas, lastX, curX,
          chartColors.cmoColor);
      break;

    case SecondaryState.EOM:
      drawLine(lastPoint.eom, curPoint.eom, canvas, lastX, curX,
          chartColors.eomColor);
      break;

    case SecondaryState.PVI_NVI:
      drawLine(lastPoint.pvi, curPoint.pvi, canvas, lastX, curX,
          chartColors.pviColor);
      drawLine(lastPoint.nvi, curPoint.nvi, canvas, lastX, curX,
          chartColors.nviColor);
      break;

    case SecondaryState.VORTEX:
      drawLine(lastPoint.viPlus, curPoint.viPlus, canvas, lastX, curX,
          chartColors.vortexPlusColor);
      drawLine(lastPoint.viMinus, curPoint.viMinus, canvas, lastX, curX,
          chartColors.vortexMinusColor);
      break;

    case SecondaryState.AROON:
      // 画3条线
      drawLine(lastPoint.aroonUp, curPoint.aroonUp, canvas, lastX, curX,
          chartColors.aroonUpColor);
      drawLine(lastPoint.aroonDown, curPoint.aroonDown, canvas, lastX, curX,
          chartColors.aroonDownColor);
      // Osc(可选)
      drawLine(lastPoint.aroonOsc, curPoint.aroonOsc, canvas, lastX, curX,
          chartColors.aroonOscColor);
      break;

    case SecondaryState.SAR:
      // 画一条线 or 一系列点
      // 1) 你可以直接在 drawChart(lastPoint, curPoint) 里用 drawLine(...) or drawCircle(...)

      // 演示:点对点画圆 (可替换成 line)
      final psarLast = lastPoint.psar;
      final psarCur = curPoint.psar;
      if (psarLast != null && psarLast.isFinite) {
        double yLast = getY(psarLast);
        Paint p = chartPaint
          ..color =
              curPoint.psarIsUp! ? chartColors.upColor : chartColors.dnColor
          ..style = PaintingStyle.fill
          ..strokeWidth = 1.0;

        // 这里画上一个点
        // lastX, yLast => 2.5半径的小圆
        canvas.drawCircle(Offset(lastX, yLast), 2.5, p);
      }

      if (psarCur != null && psarCur.isFinite) {
        double yCur = getY(psarCur);
        Paint p = chartPaint
          ..color =
              curPoint.psarIsUp! ? chartColors.upColor : chartColors.dnColor
          ..style = PaintingStyle.fill
          ..strokeWidth = 1.0;
        // 这里画当前点
        canvas.drawCircle(Offset(curX, yCur), 2.5, p);
      }
      break;

    case SecondaryState.ICHIMOKU:
      drawIchimoku(lastPoint, curPoint, lastX, curX, size, canvas);
      break;

    case SecondaryState.TSI:
      // 画 TSI主线
      drawLine(lastPoint.tsi, curPoint.tsi, canvas, lastX, curX,
          chartColors.tsiColor);
      // 再画 TSI 信号线
      drawLine(lastPoint.tsiSignal, curPoint.tsiSignal, canvas, lastX, curX,
          chartColors.tsiSignalColor);
      break;
    case SecondaryState.PPO:
      // 与MACD类似,画柱状或线?
      // 常见做法:PPO主线 & PPO信号线 两条线
      drawLine(lastPoint.ppo, curPoint.ppo, canvas, lastX, curX,
          chartColors.ppoColor);
      drawLine(lastPoint.ppoSignal, curPoint.ppoSignal, canvas, lastX, curX,
          chartColors.ppoSignalColor);
      break;
    case SecondaryState.TRIX:
      drawLine(lastPoint.trix, curPoint.trix, canvas, lastX, curX,
          chartColors.trixColor);
      drawLine(lastPoint.trixSignal, curPoint.trixSignal, canvas, lastX, curX,
          chartColors.trixSignalColor);
      break;
    case SecondaryState.DMI:
      // 画pdi、mdi、adx (以及adxr)
      drawLine(lastPoint.pdi, curPoint.pdi, canvas, lastX, curX,
          chartColors.dmiPdiColor);
      drawLine(lastPoint.mdi, curPoint.mdi, canvas, lastX, curX,
          chartColors.dmiMdiColor);
      drawLine(lastPoint.adx, curPoint.adx, canvas, lastX, curX,
          chartColors.dmiAdxColor);
      // 如果还有 adxr
      drawLine(lastPoint.adxr, curPoint.adxr, canvas, lastX, curX,
          chartColors.dmiAdxrColor);
      break;
    case SecondaryState.MACD:
      drawMACD(curPoint, canvas, curX, lastPoint, lastX);
      break;
    case SecondaryState.KDJ:
      drawLine(lastPoint.k, curPoint.k, canvas, lastX, curX,
          this.chartColors.kColor);
      drawLine(lastPoint.d, curPoint.d, canvas, lastX, curX,
          this.chartColors.dColor);
      drawLine(lastPoint.j, curPoint.j, canvas, lastX, curX,
          this.chartColors.jColor);
      break;
    case SecondaryState.RSI:
      drawLine(lastPoint.rsi, curPoint.rsi, canvas, lastX, curX,
          this.chartColors.rsiColor);
      break;
    case SecondaryState.WR:
      drawLine(lastPoint.r, curPoint.r, canvas, lastX, curX,
          this.chartColors.rsiColor);
      break;
    case SecondaryState.CCI:
      drawLine(lastPoint.cci, curPoint.cci, canvas, lastX, curX,
          this.chartColors.rsiColor);
      break;
    case SecondaryState.CMF:
      drawLine(lastPoint.cmf, curPoint.cmf, canvas, lastX, curX,
          chartColors.cmfColor);
      break;
    case SecondaryState.CHAIKIN_OSC:
      drawLine(lastPoint.chaikinOscillator, curPoint.chaikinOscillator,
          canvas, lastX, curX, chartColors.chaikinOscColor);
      break;
    case SecondaryState.KLINGER:
      drawLine(lastPoint.kvo, curPoint.kvo, canvas, lastX, curX,
          chartColors.klingerColor);
      drawLine(lastPoint.kvoSignal, curPoint.kvoSignal, canvas, lastX, curX,
          chartColors.klingerSignalColor);
      break;
    case SecondaryState.VPT:
      drawLine(lastPoint.vpt, curPoint.vpt, canvas, lastX, curX,
          chartColors.vptColor);
      break;
    case SecondaryState.FORCE:
      drawLine(lastPoint.forceIndex, curPoint.forceIndex, canvas, lastX, curX,
          chartColors.forceIndexColor);
      break;
    case SecondaryState.ROC:
      drawLine(lastPoint.roc, curPoint.roc, canvas, lastX, curX,
          chartColors.rocColor);
      drawLine(lastPoint.rocSignal, curPoint.rocSignal, canvas, lastX, curX,
          chartColors.rocSignalColor);
      break;
    case SecondaryState.ULTIMATE:
      drawLine(lastPoint.ultimateOsc, curPoint.ultimateOsc, canvas, lastX,
          curX, chartColors.ultimateOscColor);
      break;
    case SecondaryState.CONNORS_RSI:
      drawLine(lastPoint.connorsRsi, curPoint.connorsRsi, canvas, lastX, curX,
          chartColors.connorsRsiColor);
      break;
    case SecondaryState.STOCH_RSI:
      drawLine(lastPoint.stochRsiK, curPoint.stochRsiK, canvas, lastX, curX,
          chartColors.stochRsiKColor);
      drawLine(lastPoint.stochRsiD, curPoint.stochRsiD, canvas, lastX, curX,
          chartColors.stochRsiDColor);
      break;
    case SecondaryState.RVI:
      drawLine(lastPoint.rvi, curPoint.rvi, canvas, lastX, curX,
          chartColors.rviColor);
      drawLine(lastPoint.rviSignal, curPoint.rviSignal, canvas, lastX, curX,
          chartColors.rviSignalColor);
      break;
    case SecondaryState.DPO:
      drawLine(lastPoint.dpo, curPoint.dpo, canvas, lastX, curX,
          chartColors.dpoColor);
      break;
    case SecondaryState.KAMA:
      drawLine(lastPoint.kama, curPoint.kama, canvas, lastX, curX,
          chartColors.kamaColor);
      break;
    case SecondaryState.HMA:
      drawLine(lastPoint.hma, curPoint.hma, canvas, lastX, curX,
          chartColors.hmaColor);
      break;
    case SecondaryState.KELTNER:
      drawLine(lastPoint.keltnerMiddle, curPoint.keltnerMiddle, canvas, lastX,
          curX, chartColors.keltnerMidColor);
      drawLine(lastPoint.keltnerUpper, curPoint.keltnerUpper, canvas, lastX,
          curX, chartColors.keltnerUpColor);
      drawLine(lastPoint.keltnerLower, curPoint.keltnerLower, canvas, lastX,
          curX, chartColors.keltnerDnColor);
      break;
    case SecondaryState.DONCHIAN:
      drawLine(lastPoint.donchianMiddle, curPoint.donchianMiddle, canvas,
          lastX, curX, chartColors.donchianMidColor);
      drawLine(lastPoint.donchianUpper, curPoint.donchianUpper, canvas, lastX,
          curX, chartColors.donchianUpColor);
      drawLine(lastPoint.donchianLower, curPoint.donchianLower, canvas, lastX,
          curX, chartColors.donchianDnColor);
      break;
    case SecondaryState.BOLL_BANDWIDTH:
      drawLine(lastPoint.bollBandwidth, curPoint.bollBandwidth, canvas, lastX,
          curX, chartColors.bollBandwidthColor);
      break;
    case SecondaryState.CHAIKIN_VOLATILITY:
      drawLine(lastPoint.chaikinVolatility, curPoint.chaikinVolatility,
          canvas, lastX, curX, chartColors.chaikinVolatilityColor);
      break;
    case SecondaryState.HV_PERCENTILE:
      drawLine(lastPoint.hvPercentile, curPoint.hvPercentile, canvas, lastX,
          curX, chartColors.hvPercentileColor);
      break;
    case SecondaryState.ATR_PERCENTILE:
      drawLine(lastPoint.atrPercentile, curPoint.atrPercentile, canvas, lastX,
          curX, chartColors.atrPercentileColor);
      break;
    case SecondaryState.ELDER_RAY:
      drawLine(lastPoint.elderBull, curPoint.elderBull, canvas, lastX, curX,
          chartColors.elderBullColor);
      drawLine(lastPoint.elderBear, curPoint.elderBear, canvas, lastX, curX,
          chartColors.elderBearColor);
      break;
    case SecondaryState.ICHIMOKU_SPAN:
      drawLine(lastPoint.ichimokuSpanDiff, curPoint.ichimokuSpanDiff, canvas,
          lastX, curX, chartColors.ichimokuSpanDiffColor);
      break;
    case SecondaryState.PIVOT:
      drawLine(lastPoint.pivot, curPoint.pivot, canvas, lastX, curX,
          chartColors.pivotColor);
      drawLine(lastPoint.pivotR1, curPoint.pivotR1, canvas, lastX, curX,
          chartColors.pivotResistanceColor);
      drawLine(lastPoint.pivotR2, curPoint.pivotR2, canvas, lastX, curX,
          chartColors.pivotResistanceColor.withValues(alpha: 0.7));
      drawLine(lastPoint.pivotR3, curPoint.pivotR3, canvas, lastX, curX,
          chartColors.pivotResistanceColor.withValues(alpha: 0.4));
      drawLine(lastPoint.pivotS1, curPoint.pivotS1, canvas, lastX, curX,
          chartColors.pivotSupportColor);
      drawLine(lastPoint.pivotS2, curPoint.pivotS2, canvas, lastX, curX,
          chartColors.pivotSupportColor.withValues(alpha: 0.7));
      drawLine(lastPoint.pivotS3, curPoint.pivotS3, canvas, lastX, curX,
          chartColors.pivotSupportColor.withValues(alpha: 0.4));
      break;
    case SecondaryState.GANN_FAN:
      drawLine(lastPoint.gann1x1, curPoint.gann1x1, canvas, lastX, curX,
          chartColors.gann1x1Color);
      drawLine(lastPoint.gann1x2, curPoint.gann1x2, canvas, lastX, curX,
          chartColors.gann1x2Color);
      drawLine(lastPoint.gann2x1, curPoint.gann2x1, canvas, lastX, curX,
          chartColors.gann2x1Color);
      break;
    default:
      break;
  }
}