moveK method

dynamic moveK(
  1. dynamic value
)

Implementation

moveK(value) {
  if (value.containsKey('md') && value['md'] != 0 ||
      value.containsKey('index') && value['index'] >= 0) {
    if (value['md'] != 0 && value['md'] != null) {
      var cmd = kMDStartX + value['md'];
      // print('开始坐标: $kMDStartX 移动距离: $cmd.   按下索引: $kMDStartI');
      if (cmd > 0) {//像右拖拽
        int n = (cmd / kWG).ceil(); //计算移动了几根线
        if(n>kMDStartI){ //如果超过了开始索引,也就是小于0了,则等于开始索引
          n = kMDStartI;
        }
        num nw = n*kWG;//计算总宽度
        kStartX = cmd -nw;//用总宽度-移动距离就是开始坐标
        kStartI = kMDStartI-n;// 用开始索引-移动索引就是开始索引
        kStartI = kStartI<=0?0:kStartI;
        // print('索引: $kStartI  坐标 $kStartX');
      } else {//像左拖拽
        kStartI = kMDStartI - (cmd / kWG).ceil();
        kStartX = Tools.modulo(cmd, kWG);
      }
    }
    else if (value['index'] >= 0) {
      //这里逻辑没有测试
      kStartI = value['index'];
    }
    /**
     * 边界检测
     * 左边第一根最多可以拖拽到bjx位置,留白空间是bjx的宽度
     * 右边最后一根最多可以拖拽到bjx位置,留白空间是w-bjx的位置
     * 当开始索引小于等于0时,设置开始索引为0,
     *                    如果开始坐标>=0检测左边留白,如果留白大于bjx则设置到bjx,否则不用处理左边留白
     *                    如果开始坐标<0 检测右边留白,如果留白大于w-bjx,则按照bjx从新计算索引,否则不用处理
     * 当开始索引大于0时,检测右边留白,如果留白大于w-bjx,则按照bjx从新计算索引,否则不用处理
     */
    var bx = kStartX + (chartData.kDataL - kStartI) * kWG;//最后一根k线绘制点距离左边的像素,如果小于bjx则不能在往左边拖拽了
    // print('开始索引: $kStartI. 开始坐标 $kStartX');
    if (kStartI <= 0) {
      kStartI = 0;
      if(kStartX>=0){
        if(kStartX>kElement['k']!['w']-kWG){
          // print('超出留白');
          kStartX = kElement['k']!['w']-kWG;
        }
      }
      else if(kStartX<0){
        if (bx < kWG) {
          var kknum = (kWG / kWG).ceil();
          kStartX = kWG - kknum * kWG;
          kStartI = chartData.kDataL - kknum;
          if (kStartI < 0) {
            kStartI = 0;
          }
        }
      }
    } else {
     if (bx < kWG) {
        // print('从新计算');
        var kknum = (kWG / kWG).ceil();
        kStartX = kWG - kknum * kWG;
        kStartI = chartData.kDataL - kknum;
        if (kStartI < 0) {
          kStartI = 0;
          kStartX = 0;
        }
      }
    }
    if(kStartX>0){
      kNum = ((kElement['k']!['w']-kStartX) / kWG).ceil(); //需要展示的k线数量
    }else{
      kNum = (kElement['k']!['w'] / kWG).ceil(); //需要展示的k线数量
      if(kNum*kWG+kStartX<kElement['k']!['w']){
        kNum+=1;
      }
    }
    kStopI = kStartI + kNum >= chartData.kDataL
        ? chartData.kDataL
        : kStartI + kNum;
    kStartObj = chartData.klineData[kStartI];
    kStopObj = chartData.klineData[kStopI - 1];
     callMM();
    if (klineState.isMayPreLoad &&
        kStartI < preLoadkNum * 0.25 &&
        klineState.preLoadK &&
        isHaveHisK) {
      // print(
      //   '开始索引: $kStartI preLoadkNum * 0.25 ${preLoadkNum * 0.25}  结束索引:$kStopI  开始坐标 $kStartX  isMayPreLoad:${klineState.isMayPreLoad} preLoadK: ${klineState.preLoadK} isHaveHisK:${isHaveHisK}');
      // print('加载更多历史数据');
      preLoadNum += 1;
      klineState.preLoadK = false;
      klineState.notify({
        'take': TakeType['moreKlineData'],
        'codeId': klineState.widget.propertys['codeId'],
        'interval': klineState.widget.propertys['interval'],
        'code': klineState.widget.propertys['code'],
        'quote': klineState.widget.propertys['quote'],
        'amount': preLoadkNum,
        'time': chartData.klineData[0]['time'],
        'isFirst':false,
        'dicType': "add", //"cover"  加载类型 add新增, cover覆盖
        'dic': -1 //方向 -1左边历史数据,0历史数据,1未来数据
      });
    }
    // 移动k线加载更多未来数据
    if (klineState.isMayPreLoad &&
        chartData.kDataL - kStopI < preLoadkNum * 0.25 &&
        klineState.futureLoadK &&
        isHaveFutureK) {
      // print(
      //   '开始索引: $kStartI preLoadkNum * 0.25 ${preLoadkNum * 0.25}  结束索引:$kStopI  开始坐标 $kStartX  isMayPreLoad:${klineState.isMayPreLoad} preLoadK: ${klineState.preLoadK} isHaveHisK:${isHaveHisK}');
      // print('加载更多未来数据');
      preLoadNum += 1;
      klineState.futureLoadK = false;
      klineState.notify({
        'take': TakeType['moreKlineData'],
        'codeId': klineState.widget.propertys['codeId'],
        'interval': klineState.widget.propertys['interval'],
        'code': klineState.widget.propertys['code'],
        'quote': klineState.widget.propertys['quote'],
        'amount': preLoadkNum,
        'time': chartData.klineData[chartData.kDataL - 2]
            ['time'], //这里从倒数第二个开始,如果有重叠receive里也会清洗数据
        'isFirst':false,
        'dicType': "add", //"cover"  加载类型 add新增, cover覆盖
        'dic': 1 //方向 -1左边历史数据,0历史数据,1未来数据
      });
    }
  }
}