tip method

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

Implementation

tip(x, y, w, h) {
  var pathData = {};
  var linePath = [];
  var txtPath = [];
  var paddingLR = style['tipStyle']['property']['paddingLR'];
  var paddingTB = style['tipStyle']['property']['paddingTB'];
  var allTipDataPoint = [...marksDataPoint,...kolMarketsDataPoint];
  if(klineState.widget.isWeb){
    allTipDataPoint = [...allTipDataPoint,...hisTradeDataPoint];
  }
  if (allTipDataPoint.isNotEmpty) {
    var showTip = false;
    for(var i = 0,il = allTipDataPoint.length;i<il;i++){
      var v = allTipDataPoint[i];
      // print('================== ${i}');
      // print('提示内容:${v['tipList']}');
      // print('是否已经有提示${showTip}');
      // print('是否选中了画线${isSelDrawLine}');
      // print('是否选中了交易线${selectTradeData != null }');
      // print('是否展示了十字线${isShowCross}');
      // print('x:${klineState.currentPosition.dx > v['size']['x'] && klineState.currentPosition.dx <v['size']['x'] + v['size']['w']}');
      // print('y:${klineState.currentPosition.dy > v['size']['y'] && klineState.currentPosition.dy < v['size']['y'] + v['size']['h']}');
      if (v['tipList'] != null &&
          v['tipList'].isNotEmpty && //有提示内容
          !showTip && //还没有提示
          !isSelDrawLine && //没有选中画线
          selectTradeData == null && //没有选中交易线
          !isShowCross && //没有展示十字线
          (klineState.widget.isWeb || (klineState.tapStatus == TapStatus.down || klineState.tapStatus == TapStatus.longDown)) && //pc 或者 app按下
          klineState.currentPosition.dx > v['size']['x'] && //在范围内
          klineState.currentPosition.dx <
              v['size']['x'] + v['size']['w'] &&
          klineState.currentPosition.dy > v['size']['y'] && //在范围内
          klineState.currentPosition.dy <
              v['size']['y'] + v['size']['h']){
        showTip = true;
        double tipMaxWidth = 0.0;
        double tipAllHeight = 0.0;
        double tipHeight = 0.0;
        for(int tw = 0;tw<v['tipList'].length;tw++){
          var strSize = Tools.getStrW(v['tipList'][tw], style['tipStyle']['font']);
          tipMaxWidth = Tools.max(strSize['width'], tipMaxWidth);
          tipAllHeight += strSize['height'];
          tipHeight = strSize['height'];
        }
        var reactRound = style['tipStyle']['property']['reactRound'];
        double bgw = tipMaxWidth + paddingLR * 2;
        double bgh = tipAllHeight + paddingTB * 2;
        double arrow2 = 6.0;
        double bgpx = 0.0;
        var isRight = false;
        if((v.containsKey('tipLayout') && v['tipLayout'] == 'lr')||(!v.containsKey('tipLayout') && w>h)){
          //左右布局
          //宽屏,左右tip,默认左边
          bgpx = v['size']['x']-arrow2-bgw;
          isRight = false;
          //边界检测
          if (bgpx < 0) {
            //左边不够,放到右边,右边不在检测
            bgpx = v['size']['x']+v['size']['w']+arrow2;
            isRight = true;
          }
        }else{
          //竖屏,上下tip,默认剧中
          bgpx = v['size']['x'] + v['size']['w']/2- bgw / 2;
          //边界检测
          if (bgpx < 0) {
            bgpx = 0;
          } else if (bgpx + bgw > w) {
            bgpx = w - bgw;
          }
        }

        var isDown = false;
        double bgpy = 0.0;
        if((v.containsKey('tipLayout') && v['tipLayout'] == 'lr')||(!v.containsKey('tipLayout') && w>h)){
          //宽屏,左右tip,上下默认居中
          bgpy = v['size']['y'] + v['size']['h']/2- bgh / 2;
          //边界检测
          if (bgpy < 0) {
            bgpy = 0;
          } else if (bgpy + bgh > h) {
            bgpy = h - bgh;
          }
        }else{
          //竖屏,上下tip,默认居上
          bgpy = v['size']['y'] - arrow2 - bgh;
          isDown = false;
          //边界检测
          if (bgpy < 0) {
            isDown = true;
            //上边不够,放到下边,下边不在检测
            bgpy = v['size']['y']+v['size']['h'] + arrow2;
          }
        }
        linePath.add([
          "drawRect",
          [bgpx, bgpy, bgw, bgh, reactRound]
        ]);
        if((v.containsKey('tipLayout') && v['tipLayout'] == 'lr')||(!v.containsKey('tipLayout') && w>h)){
          //宽屏 左右箭头
          if (isRight) {
            //箭头向左
            linePath.addAll([
              ["moveTo",[bgpx, v['size']['y']+v['size']['h']/2 - arrow2]],
              ["lineTo",[bgpx, v['size']['y']+v['size']['h']/2 + arrow2]],
              ["lineTo",[bgpx-arrow2,v['size']['y']+v['size']['h']/2]],
              ["lineTo",[bgpx, v['size']['y']+v['size']['h']/2 - arrow2]]
            ]);
          } else {
            //箭头向右
            linePath.addAll([
              ["moveTo",[bgpx+bgw, v['size']['y']+v['size']['h']/2 - arrow2]],
              ["lineTo",[bgpx+bgw, v['size']['y']+v['size']['h']/2 + arrow2]],
              ["lineTo",[bgpx+bgw+arrow2,v['size']['y']+v['size']['h']/2]],
              ["lineTo",[bgpx+bgw, v['size']['y']+v['size']['h']/2 - arrow2]]
            ]);
          }
        }else{
          //竖屏 上下箭头
          if (isDown) {
            //箭头向上
            linePath.addAll([
              ["moveTo",[v['size']['x']+v['size']['w']/2 - arrow2, bgpy+1]],
              ["lineTo",[v['size']['x']+v['size']['w']/2 + arrow2, bgpy+1]],
              ["lineTo",[v['size']['x']+v['size']['w']/2, bgpy - arrow2]],
              ["lineTo",[v['size']['x']+v['size']['w']/2 - arrow2, bgpy+1]]
            ]);
          } else {
            //箭头向下
            linePath.addAll([
              ["moveTo",[v['size']['x']+v['size']['w']/2 - arrow2, bgpy+bgh-1]],
              ["lineTo",[v['size']['x']+v['size']['w']/2 + arrow2, bgpy+bgh-1]],
              ["lineTo",[v['size']['x']+v['size']['w']/2, bgpy+bgh + arrow2-1]],
              ["lineTo",[v['size']['x']+v['size']['w']/2 - arrow2, bgpy+bgh-1]]
            ]);
          }
        }
        //绘制背景文字
        double tipx = bgpx + paddingLR;
        double tipy = bgpy + paddingTB;
        for(int tw = 0;tw<v['tipList'].length;tw++){
          txtPath.add([
            v['tipList'][tw],
            tipx,
            tipy+tw*tipHeight,
          ]);
        }
      }
    }
  }
  pathData = {
    'linePath': linePath,
    'txtPath': txtPath,
  };
  return pathData;
}