kDraw method

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

Implementation

kDraw(x, y, w, h) {
  var pathData = {};
  var linePath = [];
  var axisPrice = [];
  var axisTime = [];
  var rangReact = [];
  var crossPath = [];
  for (var key in lineData.keys) {
    var line = lineData[key];
    for (var i = 0, il = line.length; i < il; i++) {
      if (line[i]['p'].length > 0) {
        var path = draw.draw(x, y, w, h, key, line[i],this);
        linePath.add(path);
      }
    }
  }

  //==================刻度范围=================
  if(selLineData != null && klineState.tapStatus != TapStatus.up){
    var line = selLineData!;
    double padding = 4;
    double priceh = initYTxtH;
    double timeh = initKXH;
    double timew = 0;
    double yw = initYW-20+padding*2;
    double yh = padding + priceh + padding;
    double reactRound = style['drawLineStyle']['property']['reactRound'];
    var radio = [reactRound, reactRound, reactRound, reactRound]; //矩形圆角参数
    var yp = '';
    var pl = line['p'].length;
    for(var i = 0,il = line['p'].length;i<il;i++){
      //这个point要优化,否则三角也特殊处理,超过2个点的可能都需要特殊处理,目前只有一个三角
      var point = {};
      if(i == 0){
        point = line['startPoint'];
      }else if(i == 1 && il == 3){
        point = line['secondPoint'];
      }else if(i == il-1){
        point = line['stopPoint'];
      }
      //三角特殊处理一下
      if(line['lineType'] == "SJ" && i == 1){
        point = line['secondPoint'];
      }
      var xTimeStr = Tools.intervalTimeFormat(line['p'][i]['xt'],klineState.widget.propertys['interval']);
      var timeSize = Tools.getStrW(xTimeStr, style['drawLineStyle']['font']);
      timew = timeSize['width'] + padding * 2;
      //时间背景坐标和文案坐标
      double px = point['x'] - timew / 2, tx = px + padding;
      //y轴价格
      yp = Tools.yToPrice( h, point['y'], kYMin, kScale, klineState.widget.propertys['priceDigits']);
      var py = point['y'] - yh / 2;
      if (point['y'] < yh / 2) {
        //上对齐
        py = 0;
      } else if (point['y'] > y + h - yh / 2) {
        //下对齐
        py = y + h - yh;
      }
      var axisPathPrice = [];
      var txtPathPrice = [];
      axisPrice.add({
        'axisPath':axisPathPrice,
        'txtPath':txtPathPrice,
        'py':py,
      });
      //y轴刻度背景矩形块
      axisPathPrice.add([
        "drawRect",
        [x + w- (initYW-yw)/2 - yw, py, yw, yh, radio]
      ],);
      //y轴刻度
      txtPathPrice.add([
        yp,
        x + w - (initYW-yw)/2-yw+padding,
        py + padding,
      ]);
      var axisPathTime = [];
      var txtPathTime = [];
      axisTime.add({
        'axisPath':axisPathTime,
        'txtPath':txtPathTime,
        'px':px,
      });
      //x轴刻度背景矩形块
      axisPathTime.add([
          "drawRect",
          [px, y + h - timeh, timew, timeh,radio]
        ]
      );
      //x轴刻度
      txtPathTime.add([
        xTimeStr,
        tx,
        y + h - timeh / 2,
        {'ylayout': 'center'}
      ]);
    }

    if(axisPrice.length>1){
      axisPrice.sort((a, b) {
        return a['py'].compareTo(b['py']);
      });
      axisTime.sort((a, b) {
        return a['px'].compareTo(b['px']);
      });
      rangReact.add([
        "drawRect",
        [x + w- (initYW-yw)/2 - yw, axisPrice[0]['py']+reactRound, yw, axisPrice[axisPrice.length-1]['py']-axisPrice[0]['py']]
      ]);
      rangReact.add([
        "drawRect",
        [axisTime[0]['px']+reactRound, y + h - timeh, axisTime[axisTime.length-1]['px']-axisTime[0]['px'], timeh]
      ]);
    }

    //十字线 横线 竖线 三角特殊处理一下
    Map<String,dynamic>? lastPoint;//选中的点
    if(line['point'] != null && line['point']>=0){
      if(line['point'] == 0){
        lastPoint = line['startPoint'];
      }else if(line['point'] == 1 && pl == 3){
        lastPoint = line['secondPoint'];
      }else if(line['point'] == pl-1){
        lastPoint = line['stopPoint'];
      }
      if(line['lineType'] == "SJ" && pl == 2){
        lastPoint = line['secondPoint'];
      }
    }else if(klineState.mType == 2){
      lastPoint = line['stopPoint'];
      if(line['lineType'] == "SJ" && pl == 2){
        lastPoint = line['secondPoint'];
      }
    }
    if(lastPoint != null){
      crossPath.addAll([
        [
          "moveTo",
          [x, lastPoint['y']]
        ],
        [
          "lineTo",
          [
            x + w- (initYW-yw)/2 - yw,
            lastPoint['y']
          ]
        ],
        [
          "moveTo",
          [lastPoint['x'], y]
        ],
        [
          "lineTo",
          [lastPoint['x'], y + h - timeh]
        ]
      ]);
      //放大镜默认左边
      klineState.magnifier = {
        'left':style['magnifier']['left'],
        'right':null,
        'top':style['magnifier']['top'],
        'dx':(lastPoint['x']-(style['magnifier']['left']+style['magnifier']['r']/2)),
        'dy':(lastPoint['y']-(style['magnifier']['top']+style['magnifier']['r']/2)),
      };
      if(lastPoint['x']<(klineState.klineBox['width']!/2)){
        //在y右边
        klineState.magnifier['left'] = null;
        klineState.magnifier['right'] = (initYW+ style['magnifier']['right']);
        klineState.magnifier['dx'] = ((lastPoint['x']-(klineState.klineBox['width']!-(klineState.magnifier['right']+style['magnifier']['r']/2))));
      }
    }
  }
  pathData = {
    'linePath': linePath,
    'axisPrice': axisPrice,
    'axisTime':axisTime,
    'rangReact':rangReact,
    'crossPath':crossPath,
  };
  return pathData;
}