secondary_renderer.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import 'package:flutter/material.dart';
  2. import '../entity/macd_entity.dart';
  3. import '../k_chart_widget.dart' show SecondaryState;
  4. import 'base_chart_renderer.dart';
  5. class SecondaryRenderer extends BaseChartRenderer<MACDEntity> {
  6. late double mMACDWidth;
  7. SecondaryState state;
  8. final ChartStyle chartStyle;
  9. final ChartColors chartColors;
  10. SecondaryRenderer(
  11. Rect mainRect,
  12. double maxValue,
  13. double minValue,
  14. double topPadding,
  15. this.state,
  16. int fixedLength,
  17. this.chartStyle,
  18. this.chartColors)
  19. : super(
  20. chartRect: mainRect,
  21. maxValue: maxValue,
  22. minValue: minValue,
  23. topPadding: topPadding,
  24. fixedLength: fixedLength,
  25. gridColor: chartColors.gridColor,
  26. ) {
  27. mMACDWidth = this.chartStyle.macdWidth;
  28. }
  29. @override
  30. void drawChart(MACDEntity lastPoint, MACDEntity curPoint, double lastX,
  31. double curX, Size size, Canvas canvas) {
  32. switch (state) {
  33. case SecondaryState.MACD:
  34. drawMACD(curPoint, canvas, curX, lastPoint, lastX);
  35. break;
  36. case SecondaryState.KDJ:
  37. drawLine(lastPoint.k, curPoint.k, canvas, lastX, curX,
  38. this.chartColors.kColor);
  39. drawLine(lastPoint.d, curPoint.d, canvas, lastX, curX,
  40. this.chartColors.dColor);
  41. drawLine(lastPoint.j, curPoint.j, canvas, lastX, curX,
  42. this.chartColors.jColor);
  43. break;
  44. case SecondaryState.RSI:
  45. drawLine(lastPoint.rsi, curPoint.rsi, canvas, lastX, curX,
  46. this.chartColors.rsiColor);
  47. break;
  48. case SecondaryState.WR:
  49. drawLine(lastPoint.r, curPoint.r, canvas, lastX, curX,
  50. this.chartColors.rsiColor);
  51. break;
  52. case SecondaryState.CCI:
  53. drawLine(lastPoint.cci, curPoint.cci, canvas, lastX, curX,
  54. this.chartColors.rsiColor);
  55. break;
  56. }
  57. }
  58. void drawMACD(MACDEntity curPoint, Canvas canvas, double curX,
  59. MACDEntity lastPoint, double lastX) {
  60. final macd = curPoint.macd ?? 0;
  61. double macdY = getY(macd);
  62. double r = mMACDWidth / 2;
  63. double zeroy = getY(0);
  64. if (macd > 0) {
  65. canvas.drawRect(Rect.fromLTRB(curX - r, macdY, curX + r, zeroy),
  66. chartPaint..color = this.chartColors.upColor);
  67. } else {
  68. canvas.drawRect(Rect.fromLTRB(curX - r, zeroy, curX + r, macdY),
  69. chartPaint..color = this.chartColors.dnColor);
  70. }
  71. if (lastPoint.dif != 0) {
  72. drawLine(lastPoint.dif, curPoint.dif, canvas, lastX, curX,
  73. this.chartColors.difColor);
  74. }
  75. if (lastPoint.dea != 0) {
  76. drawLine(lastPoint.dea, curPoint.dea, canvas, lastX, curX,
  77. this.chartColors.deaColor);
  78. }
  79. }
  80. @override
  81. void drawText(Canvas canvas, MACDEntity data, double x) {
  82. List<TextSpan>? children;
  83. switch (state) {
  84. case SecondaryState.MACD:
  85. children = [
  86. TextSpan(
  87. text: "MACD(12,26,9) ",
  88. style: getTextStyle(this.chartColors.defaultTextColor)),
  89. if (data.macd != 0)
  90. TextSpan(
  91. text: "MACD:${format(data.macd)} ",
  92. style: getTextStyle(this.chartColors.macdColor)),
  93. if (data.dif != 0)
  94. TextSpan(
  95. text: "DIF:${format(data.dif)} ",
  96. style: getTextStyle(this.chartColors.difColor)),
  97. if (data.dea != 0)
  98. TextSpan(
  99. text: "DEA:${format(data.dea)} ",
  100. style: getTextStyle(this.chartColors.deaColor)),
  101. ];
  102. break;
  103. case SecondaryState.KDJ:
  104. children = [
  105. TextSpan(
  106. text: "KDJ(9,1,3) ",
  107. style: getTextStyle(this.chartColors.defaultTextColor)),
  108. if (data.macd != 0)
  109. TextSpan(
  110. text: "K:${format(data.k)} ",
  111. style: getTextStyle(this.chartColors.kColor)),
  112. if (data.dif != 0)
  113. TextSpan(
  114. text: "D:${format(data.d)} ",
  115. style: getTextStyle(this.chartColors.dColor)),
  116. if (data.dea != 0)
  117. TextSpan(
  118. text: "J:${format(data.j)} ",
  119. style: getTextStyle(this.chartColors.jColor)),
  120. ];
  121. break;
  122. case SecondaryState.RSI:
  123. children = [
  124. TextSpan(
  125. text: "RSI(14):${format(data.rsi)} ",
  126. style: getTextStyle(this.chartColors.rsiColor)),
  127. ];
  128. break;
  129. case SecondaryState.WR:
  130. children = [
  131. TextSpan(
  132. text: "WR(14):${format(data.r)} ",
  133. style: getTextStyle(this.chartColors.rsiColor)),
  134. ];
  135. break;
  136. case SecondaryState.CCI:
  137. children = [
  138. TextSpan(
  139. text: "CCI(14):${format(data.cci)} ",
  140. style: getTextStyle(this.chartColors.rsiColor)),
  141. ];
  142. break;
  143. }
  144. TextPainter tp = TextPainter(
  145. text: TextSpan(children: children), textDirection: TextDirection.ltr);
  146. tp.layout();
  147. tp.paint(canvas, Offset(x, chartRect.top - topPadding));
  148. }
  149. @override
  150. void drawVerticalText(canvas, textStyle, int gridRows) {
  151. TextPainter maxTp = TextPainter(
  152. text: TextSpan(text: "${format(maxValue)}", style: textStyle),
  153. textDirection: TextDirection.ltr);
  154. maxTp.layout();
  155. TextPainter minTp = TextPainter(
  156. text: TextSpan(text: "${format(minValue)}", style: textStyle),
  157. textDirection: TextDirection.ltr);
  158. minTp.layout();
  159. maxTp.paint(canvas,
  160. Offset(chartRect.width - maxTp.width, chartRect.top - topPadding));
  161. minTp.paint(canvas,
  162. Offset(chartRect.width - minTp.width, chartRect.bottom - minTp.height));
  163. }
  164. @override
  165. void drawGrid(Canvas canvas, int gridRows, int gridColumns) {
  166. // canvas.drawLine(Offset(0, chartRect.top), Offset(chartRect.width, chartRect.top), gridPaint); //hidden line
  167. canvas.drawLine(Offset(0, chartRect.bottom),
  168. Offset(chartRect.width, chartRect.bottom), gridPaint);
  169. double columnSpace = chartRect.width / gridColumns;
  170. for (int i = 0; i <= columnSpace; i++) {
  171. //mSecondaryRect垂直线
  172. canvas.drawLine(Offset(columnSpace * i, chartRect.top - topPadding),
  173. Offset(columnSpace * i, chartRect.bottom), gridPaint);
  174. }
  175. }
  176. }