callLineData method
dynamic
callLineData(
- 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;
}