moveK method
dynamic
moveK(
- 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未来数据
});
}
}
}