tip method
dynamic
tip(
- dynamic x,
- dynamic y,
- dynamic w,
- 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;
}