kCrossPath method

dynamic kCrossPath(
  1. dynamic x,
  2. dynamic y,
  3. dynamic w,
  4. dynamic h,
)

Implementation

kCrossPath(x, y, w, h) {
  // 刻度矩形块样式,使用十字线的填充颜色,把描边去掉
  var pathData = {};
  var linePath = [];
  var addLinePath = [];
  var txtPath = [];
  mPreKData = null;
  mKData = null;
  klineState.crossTipPro['zdf'] = null;
  klineState.crossTipPro['top'] = -1;
  if (kMouseI < 0 || kMouseI >= kStopI) {
    return null;
  }
  double padding = style['crossStyle']['property']['padding'];
  double priceh = initYTxtH;
  //也许可以通过文字测量获取
  double timeh = initKXH;
  var xTimeStr = Tools.intervalTimeFormat(
      chartData.klineData[kMouseI]['time'],
      klineState.widget.propertys['interval']);
  var timeSize = Tools.getStrW(xTimeStr, style['crossStyle']['font']);
  double timew = timeSize['width'] + padding * 2;

  dynamic yp = '';
  double px = 0, tx = 0;
  if (kMouseX < timew / 2) {
    //左对齐
    px = 0;
  } else if (kElement['k']!['w'] - kMouseX < timew / 2) {
    //右对齐
    px = kElement['k']!['w'] - timew;
  } else {
    //中间对齐
    px = kMouseX - timew / 2;
  }
  tx = px + padding;

  var ye = ypcallary;
  var yei = 0;
  for (; yei < ye.length; yei++) {
    if (klineState.currentPosition.dx > ye[yei]['cx'] &&
        klineState.currentPosition.dx < ye[yei]['cx'] + ye[yei]['cw'] - kYw &&
        klineState.currentPosition.dy > ye[yei]['y'] &&
        klineState.currentPosition.dy < ye[yei]['y'] + ye[yei]['h']) {
      if (ye[yei]['type'] == "x" || ye[yei]['type'] == 'ftTip') {
        //十字线 竖线
        linePath.addAll([
          [
            "moveTo",
            [kElement['k']!['x'] + kMouseX, y]
          ],
          [
            "lineTo",
            [kElement['k']!['x'] + kMouseX, y + h]
          ]
        ]);
        //x轴刻度背景矩形块
        linePath.add([
          "drawRect",
          [kElement['k']!['x'] + px, y + h - timeh, timew, timeh,style['crossStyle']['property']['reactRound']]
        ]);
        //x轴刻度文字默认居中对齐
        txtPath.add([
          xTimeStr,
          kElement['k']!['x'] + tx,
          y + h - timeh / 2,
          {'ylayout': 'center'}
        ]);
      } else {
        num yw = initYW-20+padding*2;
        num yx = yw+10-padding;
        if (ye[yei]['type'] == "ft" && ye[yei]['name'] == Indicator['VOLUME']) {
          yp = Tools.yToPrice(
              ye[yei]['h'],
              klineState.currentPosition.dy - ye[yei]['y'],
              ye[yei]['min'],
              ye[yei]['sc'],
              klineState.widget.propertys['amountDigits']); //成交量方向写死1
          yp = Tools.bigNumWithStr(num.parse(yp), 2);
        } else {
          yp = Tools.yToPrice(
              ye[yei]['h'],
              klineState.currentPosition.dy - ye[yei]['y'],
              ye[yei]['min'],
              ye[yei]['sc'],
              klineState.widget.propertys['priceDigits']);
        }
        double yh = padding + priceh + padding;
        var reactRound = style['crossStyle']['property']['reactRound'];
        // var radio = reactRound; //矩形圆角参数
        if (ye[yei]['type'] == "k") {
          yh = padding +
              priceh +
              padding / 2 +
              priceh +
              padding; //两层高度,一个价格,一个涨跌幅
          // radio = [0.0, reactRound, reactRound, 0.0];
        }
        double py = klineState.currentPosition.dy - yh / 2;
        if (klineState.currentPosition.dy < yh / 2) {
          //上对齐
          py = 0;
        } else if (klineState.currentPosition.dy > y + h - kXh - yh / 2) {
          //下对齐
          py = y + h - kXh - yh;
        }
        //十字线 横线 竖线
        linePath.addAll([
          [
            "moveTo",
            [ye[yei]['cx'], klineState.currentPosition.dy]
          ],
          [
            "lineTo",
            [
              ye[yei]['cx'] + ye[yei]['cw'] - yx,
              klineState.currentPosition.dy
            ]
          ],
          [
            "moveTo",
            [kElement['k']!['x'] + kMouseX, y]
          ],
          [
            "lineTo",
            [kElement['k']!['x'] + kMouseX, y + h - timeh]
          ]
        ]);

        //x轴y轴刻度背景矩形块
        linePath.addAll([
          // y轴背景不用绘制了,去kline里绘制
          // [
          //   "drawRect",
          //   [ye[yei]['cx'] + ye[yei]['cw'] - yx, py, yw, yh, radio]
          // ],
          [
            "drawRect",
            [kElement['k']!['x'] + px, y + h - timeh, timew, timeh,reactRound]
          ]
        ]);
        // 价钱不用绘制了,去kline里绘制
        //y轴刻度
        // txtPath.add([
        //   yp,
        //   ye[yei]['cx'] + ye[yei]['cw'] - yx+yw-padding,
        //   py + padding,
        //   {'xlayout': 'right'}
        // ]);
        //x轴刻度
        txtPath.add([
          xTimeStr,
          kElement['k']!['x'] + tx,
          y + h - timeh / 2,
          {'ylayout': 'center'}
        ]);
        if (ye[yei]['type'] == "k") {
          crossYprice = double.parse(yp);
          crossAddSize = {
            'x': ye[yei]['cx'] + ye[yei]['cw'] - yx - 1 - priceh*1.5,
            'y': py,
            'w': priceh*1.5,
            'h': yh
          };
          //横线绘制加号
          addLinePath.add([
            "drawRect",
            [
              crossAddSize['x'],
              crossAddSize['y'],
              crossAddSize['w'],
              crossAddSize['h'],
              [reactRound, 0.0, 0.0, reactRound]
            ]
          ]);
          var txtX = crossAddSize['x'] + crossAddSize['w']/2;
          var txtY = crossAddSize['y'] + yh/2;
          addLinePath.add([
            "drawCircle",
            [txtX, txtY, (crossAddSize['w'] - 4) / 2]
          ]);
          addLinePath.addAll([
            [
              "moveTo",
              [txtX - (crossAddSize['w'] - 10) / 2, txtY]
            ],
            [
              "lineTo",
              [txtX + (crossAddSize['w'] - 10) / 2, txtY]
            ]
          ]);
          addLinePath.addAll([
            [
              "moveTo",
              [txtX, txtY - (crossAddSize['w'] - 10) / 2]
            ],
            [
              "lineTo",
              [txtX, txtY + (crossAddSize['w'] - 10) / 2]
            ]
          ]);

          //涨跌幅文案 (最新成交价-当前Y轴移入价格)/最新成交价(百分数保留2位小数)
          var lastKD = chartData.klineData[chartData.kDataL - 1];
          dynamic change = Tools.toFixed(
              ((num.parse(yp) - lastKD['close']) / lastKD['close'] * 100), 2);
          change = num.parse(change) > 0 ? "+$change%" : '$change%';
          // 涨跌幅不用绘制了,去kline里绘制
          // txtPath.add([
          //   change,
          //   ye[yei]['cx'] + ye[yei]['cw'] - yx+yw-padding,
          //   py + padding + priceh + padding / 2,
          //   {'xlayout': 'right'}
          // ]);
          klineState.crossTipPro['zdf'] = change;
        }
        klineState.crossTipPro['left'] = ye[yei]['cx'] + ye[yei]['cw'] - yx;
        klineState.crossTipPro['top'] = py;
        klineState.crossTipPro['w'] = yw;
        klineState.crossTipPro['h'] = yh;
        klineState.crossTipPro['price'] = yp;

      }
      mPreKData = kMouseI - 1 >= 0 ? chartData.klineData[kMouseI - 1] : null;
      mKData = chartData.klineData[kMouseI];
      if (mKData!['history'] == null) {
        mKData!['history'] = [];
      } else {
        mKData!['history'] = [];
      }
      for (int hi = 0, hil = hisTradeDataPoint.length; hi < hil; hi++) {
        Map hiItem = hisTradeDataPoint[hi];
        if (hiItem['kDataI'] == kMouseI) {
          mKData!['history'].add(hiItem);
        }
      }
      break;
    }
  }
  pathData = {'linePath': linePath, 'txtPath': txtPath,'addLinePath':addLinePath};
  return pathData;
}