callLineData method

dynamic callLineData(
  1. dynamic type
)

Implementation

callLineData(type) {
  double dx = klineState.currentPosition.dx;
  dx = Tools.max(0.0, dx);
  dx = Tools.min(kElement['k']!['x']+kElement['k']!['w'], dx);
  double dy = klineState.currentPosition.dy;
  dy = Tools.max(0.0, dy);
  dy = Tools.min(kElement['k']!['y']+kElement['k']!['h'], dy);

  //在屏幕中的x坐标
  var xx =
      (dx - kElement['k']!['x'] - kStartX).floor();
  //在屏幕中的x坐标占比 给x轴不跟k线绑定的画线使用,在屏幕尺寸发生变化的时候,这些线的x坐标需要根据占比从新计算新的x坐标 xxbfb * grail.w
  var xxbfb = xx / kElement['k']!['w'];
  //将鼠标x坐标转换成k线索引
  var xi = (xx / kWG).floor() + kStartI;
  //将鼠标x坐标转换成k线时间
  var xt = Tools.getKTime(xi,chartData.kDataL-1,chartData.klineData,klineState.widget.propertys['interval']);

  // print('索引: ${xi}  时间:${xt}.  最后一根:${chartData.kDataL-1}. 数量差:${xi-(chartData.kDataL-1)}');
  //计算偏移
  var xp = dx -
      kElement['k']!['x'] -
      (xi - kStartI) * kWG -
      kStartX;
  //在把鼠标y坐标转换成价钱
  var y = num.parse(Tools.yToPrice(kYh, dy, kYMin,
      kScale, klineState.widget.propertys['priceDigits']));
  //获取当前线的点击绘画次数 需要绘画几次
  var take = draw.config[drawLineType]['take'];

  //获取当前画线类型画线对象数据
  lineData[drawLineType] ??= [];
  var line = lineData[drawLineType]; //线对象
  Map<String, dynamic>? pd = line.length > 0 ? line[line.length - 1] : null;
  if (type == "down") {
    if (pd == null || pd['p'].length == take) {
      Map lineStyle = deepCopyStyle(draw.config[drawLineType]);
      //增加对象
      // print("创建新的点  $take");
      if (take > 1) {
        pd = {
          'p': [
            {'x': xi,'xt':xt, 'xx': xx, 'xxbfb': xxbfb, 'xp': xp, 'y': y},
            {'x': xi,'xt':xt, 'xx': xx, 'xxbfb': xxbfb, 'xp': xp, 'y': y}
          ],
          'style':{...lineStyle},
          'lineType':drawLineType,
        }; //最后一个是移动点
        line.add(pd);
      } else {
        // print('创建新的点 $take  只有一个点');
        //只有一个点
        pd = {
          'p': [
            {'x': xi,'xt':xt, 'xx': xx, 'xxbfb': xxbfb, 'xp': xp, 'y': y}
          ],
          'style':{...lineStyle},
          'lineType':drawLineType,
        };
        //所以放入就结束点添加
        line.add(pd);
      }
    } else {
      //点不够继续加点
      if (pd['p'].length < take) {
        //加点 加到倒数第二个的位置
        pd['p'].add({'x': xi,'xt':xt, 'xx': xx, 'xxbfb': xxbfb, 'xp': xp, 'y': y});
        //这里水平线基本不可能进来,除非一根水平线上需要3个点绘制出来,才有机会在倒数第二个点插入点。
        //对于只有两个点的线第一次加点就都加完了。 因为第一次push了两个点 开始点和结束活动点 活动点会在下面移动时不断更换
        //垂直竖线和水平横线是一样的逻辑
      }
    }
  } else {
    //换点  换最后一个移动点 如果只有一个点就不用换了 因为没有移动绘制过程
    if (pd != null && pd['p'].length > 0 && take > 1) {
      pd['p'][pd['p'].length - 1] = {
        'x': xi,
        'xt':xt,
        'xx': xx,
        'xxbfb': xxbfb,
        'xp': xp,
        'y': y
      };
      // print('换点 ${pd['p']}');
    }
  }
  selLineData = pd;
}