hqchart 1.1.14691 → 1.1.14705

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4525,6 +4525,15 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4525
4525
  }
4526
4526
  }
4527
4527
 
4528
+ if (option.FastSlide)
4529
+ {
4530
+ var item=option.FastSlide;
4531
+ if (IFrameSplitOperator.IsNumber(item.MinDistance)) chart.FastSlideConfig.MinDistance=item.MinDistance;
4532
+ if (IFrameSplitOperator.IsNumber(item.MinSpeed)) chart.FastSlideConfig.MinSpeed=item.MinSpeed;
4533
+ if (IFrameSplitOperator.IsNumber(item.MaxTime)) chart.FastSlideConfig.MaxTime=item.MaxTime;
4534
+ if (IFrameSplitOperator.IsBool(item.Enable)) chart.FastSlideConfig.Enable=item.Enable;
4535
+ }
4536
+
4528
4537
  if (chart.ClassName=="KLineChartContainer")
4529
4538
  {
4530
4539
  if (!option.DragSelectRect)
@@ -4593,6 +4602,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4593
4602
  if (IFrameSplitOperator.IsBool(item.RightButton.Enable)) chart.ChartCorssCursor.RightButton.Enable=item.RightButton.Enable;
4594
4603
  }
4595
4604
 
4605
+ if (item.BottomButton)
4606
+ {
4607
+ var subItem=item.BottomButton;
4608
+ if (IFrameSplitOperator.IsBool(subItem.Enable)) chart.ChartCorssCursor.BottomButton.Enable=subItem.Enable;
4609
+ }
4610
+
4596
4611
  if (IFrameSplitOperator.IsNumber(item.PriceFormatType)) chart.ChartCorssCursor.StringFormatY.PriceFormatType=item.PriceFormatType;
4597
4612
  if (IFrameSplitOperator.IsNumber(item.DataFormatType)) chart.ChartCorssCursor.StringFormatY.DataFormatType=item.DataFormatType;
4598
4613
  if (IFrameSplitOperator.IsBool(item.EnableKeyboard)) chart.ChartCorssCursor.EnableKeyboard=item.EnableKeyboard;
@@ -5077,6 +5092,15 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5077
5092
  if (IFrameSplitOperator.IsNumber(item.WheelYMove)) chart.EnableYDrag.WheelYMove=item.WheelYMove;
5078
5093
  }
5079
5094
 
5095
+ if (option.FastSlide)
5096
+ {
5097
+ var item=option.FastSlide;
5098
+ if (IFrameSplitOperator.IsNumber(item.MinDistance)) chart.FastSlideConfig.MinDistance=item.MinDistance;
5099
+ if (IFrameSplitOperator.IsNumber(item.MinSpeed)) chart.FastSlideConfig.MinSpeed=item.MinSpeed;
5100
+ if (IFrameSplitOperator.IsNumber(item.MaxTime)) chart.FastSlideConfig.MaxTime=item.MaxTime;
5101
+ if (IFrameSplitOperator.IsBool(item.Enable)) chart.FastSlideConfig.Enable=item.Enable;
5102
+ }
5103
+
5080
5104
  //分页
5081
5105
  if (option.PageInfo) chart.SetPageInfo(option.PageInfo);
5082
5106
 
@@ -5098,6 +5122,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5098
5122
  if (IFrameSplitOperator.IsBool(item.RightButton.Enable)) chart.ChartCorssCursor.RightButton.Enable=item.RightButton.Enable;
5099
5123
  }
5100
5124
 
5125
+ if (item.BottomButton)
5126
+ {
5127
+ var subItem=item.BottomButton;
5128
+ if (IFrameSplitOperator.IsBool(subItem.Enable)) chart.ChartCorssCursor.BottomButton.Enable=subItem.Enable;
5129
+ }
5130
+
5101
5131
  if (IFrameSplitOperator.IsNumber(item.PriceFormatType)) chart.ChartCorssCursor.StringFormatY.PriceFormatType=item.PriceFormatType;
5102
5132
  if (IFrameSplitOperator.IsNumber(item.DataFormatType)) chart.ChartCorssCursor.StringFormatY.DataFormatType=item.DataFormatType;
5103
5133
 
@@ -6834,6 +6864,10 @@ var JSCHART_EVENT_ID=
6834
6864
  ON_DBCLICK_DEAL_ROW:167,
6835
6865
 
6836
6866
  ON_FORMAT_OVERLAY_INDEX_OUT_TEXT:168, //格式化叠指标标题
6867
+
6868
+ ON_TOUCH_FAST_SLIDE:169, //快速滑动
6869
+
6870
+ ON_CLICK_CROSSCURSOR_BOTTOM:170, //十字光标底部文字点击
6837
6871
  }
6838
6872
 
6839
6873
  var JSCHART_OPERATOR_ID=
@@ -6862,6 +6896,8 @@ var JSCHART_OPERATOR_ID=
6862
6896
 
6863
6897
  OP_GOTO:16, //移动到某一个天或某一个分钟
6864
6898
  OP_GOTO_BY_DATAINDEX:17, //的移动到某一个数据起始位置
6899
+
6900
+ OP_MOVE_CORSSCURSOR:18, //移动十字光标 { Step, Start:{ Date:, Time: } }
6865
6901
  }
6866
6902
 
6867
6903
  var JSCHART_DRAG_ID=
@@ -7207,6 +7243,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7207
7243
  this.mapEvent=new Map(); //通知外部调用 key:JSCHART_EVENT_ID value:{Callback:回调,}
7208
7244
 
7209
7245
  this.PhonePinch=null; //手机双指操作信息
7246
+ this.TouchDrag=null; //手势拖动操作信息
7210
7247
  this.IsOnTouch = false; //是否再操作数据
7211
7248
  this.TouchDrawCount = 0; //手势绘制次数
7212
7249
  this.DisableMouse=false; //禁止鼠标事件
@@ -7262,7 +7299,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7262
7299
  this.EnableVerticalDrag=false;
7263
7300
 
7264
7301
  //十字光标长留(手势才有)
7265
- this.ClickModel={ IsShowCorssCursor:false };
7302
+ this.ClickModel={ IsShowCorssCursor:false, PreventHide:false }; //PreventHide 阻止隐藏十字光标
7266
7303
  this.EnableClickModel=false;
7267
7304
 
7268
7305
  //标题栏显示最新数据
@@ -7293,6 +7330,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7293
7330
  //SecondKeyID 1=shiftKey 2=ctrlKey 3=altKey
7294
7331
  this.AryHotKey=[]; //热键 { KeyID:87, SecondKeyID:1, CMD:JSCHART_MENU_ID.CMD_FULLSCREEN_SUMMARY_ID, Args:null, Description:"Alt+W 全屏区间统计" },
7295
7332
 
7333
+ this.FastSlideConfig={ MinDistance:500, MinSpeed:3, MaxTime:250, Enable:false }; //快速滑动配置 MinDistance=最小的距离 MinSpeed=最小速度 MaxTime=最大间隔时间(ms)
7334
+
7296
7335
  this.RestoreFocus=function(delay)
7297
7336
  {
7298
7337
  var value=1000;
@@ -7885,11 +7924,23 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7885
7924
  var button=this.ChartCorssCursor.PtInButton(x,y);
7886
7925
  if (!button) return false;
7887
7926
 
7888
- var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_CROSSCURSOR_RIGHT);
7889
- if (event && event.Callback)
7927
+ if (button.Type==1)
7890
7928
  {
7891
- var sendData={ Button:button, e };
7892
- event.Callback(event,sendData,this);
7929
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_CROSSCURSOR_RIGHT);
7930
+ if (event && event.Callback)
7931
+ {
7932
+ var sendData={ Button:button, e };
7933
+ event.Callback(event,sendData,this);
7934
+ }
7935
+ }
7936
+ else if (button.Type==2)
7937
+ {
7938
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_CROSSCURSOR_BOTTOM);
7939
+ if (event && event.Callback)
7940
+ {
7941
+ var sendData={ Button:button, e };
7942
+ event.Callback(event,sendData,this);
7943
+ }
7893
7944
  }
7894
7945
 
7895
7946
  return true;
@@ -9399,6 +9450,11 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9399
9450
  return true;
9400
9451
  }
9401
9452
 
9453
+ if (this.TryClickCrossCursor(x,y))
9454
+ {
9455
+ return true;
9456
+ }
9457
+
9402
9458
  return false;
9403
9459
  }
9404
9460
 
@@ -9410,6 +9466,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9410
9466
  this.IsOnTouch=true;
9411
9467
  this.TouchDrawCount=0;
9412
9468
  this.PhonePinch=null;
9469
+ this.TouchDrag=null;
9470
+ if (this.ClickModel) this.ClickModel.PreventHide=false;
9413
9471
  this.StopDragTimer();
9414
9472
 
9415
9473
  var isSingleTouch=this.IsSingleTouch(e);
@@ -9424,7 +9482,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9424
9482
  var touches = this.GetToucheData(e, this.IsForceLandscape);
9425
9483
  var pt=this.PointAbsoluteToRelative(touches[0].clientX, touches[0].clientY, true);
9426
9484
 
9427
- if (this.TryPhoneClickButton(pt.X, pt.Y, e)) return;
9485
+ if (this.TryPhoneClickButton(pt.X, pt.Y, e))
9486
+ return;
9428
9487
 
9429
9488
  if (this.EnableVerticalDrag )
9430
9489
  {
@@ -9455,11 +9514,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9455
9514
 
9456
9515
  if (this.EnableClickModel && this.ClickModel.IsShowCorssCursor==true) bStartTimer=false;
9457
9516
 
9458
- var drag=
9459
- {
9460
- "Click":{},
9461
- "LastMove":{} //最后移动的位置
9462
- };
9517
+ var drag= { Click:{}, LastMove:{}, StartTime:Date.now() }; //LastMove 最后移动的位置
9518
+ var touchDrag={ Click:{}, LastMove:{}, StartTime:Date.now() };
9463
9519
 
9464
9520
  //var touches=this.GetToucheData(e,this.IsForceLandscape);
9465
9521
 
@@ -9467,8 +9523,14 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9467
9523
  drag.Click.Y=touches[0].clientY;
9468
9524
  drag.LastMove.X=touches[0].clientX;
9469
9525
  drag.LastMove.Y=touches[0].clientY;
9470
-
9471
9526
  this.MouseDrag=drag;
9527
+
9528
+ touchDrag.Click.X=touches[0].clientX;
9529
+ touchDrag.Click.Y=touches[0].clientY;
9530
+ touchDrag.LastMove.X=touches[0].clientX;
9531
+ touchDrag.LastMove.Y=touches[0].clientY;
9532
+ this.TouchDrag=touchDrag;
9533
+
9472
9534
  var drawPictureActive=this.GetActiveDrawPicture(); //上一次选中的
9473
9535
  var selectedChart={ Chart:this.SelectedChart.Selected.Chart, Identify:this.SelectedChart.Selected.Identify }; //上一次选中的图形
9474
9536
  this.PhoneTouchInfo={ Start:{X:touches[0].clientX, Y:touches[0].clientY }, End:{ X:touches[0].clientX, Y:touches[0].clientY } };
@@ -9590,11 +9652,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9590
9652
  }
9591
9653
  else if (this.IsPhonePinching(e))
9592
9654
  {
9593
- var phonePinch=
9594
- {
9595
- "Start":{},
9596
- "Last":{}
9597
- };
9655
+ var phonePinch={ Start:{}, Last:{}, StartTime:Date.now() };
9598
9656
 
9599
9657
  var touches=this.GetToucheData(e,this.IsForceLandscape);
9600
9658
 
@@ -9729,6 +9787,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9729
9787
  this.PhoneTouchInfo.End.X=touches[0].clientX;
9730
9788
  this.PhoneTouchInfo.End.Y=touches[0].clientY;
9731
9789
  }
9790
+
9791
+ if (this.TouchDrag)
9792
+ {
9793
+ var touchDrag=this.TouchDrag;
9794
+ touchDrag.LastMove.X=touches[0].clientX;
9795
+ touchDrag.LastMove.Y=touches[0].clientY;
9796
+ }
9732
9797
  }
9733
9798
  else if (this.IsPhonePinching(e))
9734
9799
  {
@@ -9795,6 +9860,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9795
9860
  JSConsole.Chart.Log('[KLineChartContainer:OnTouchEnd]',e);
9796
9861
  if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
9797
9862
 
9863
+ this.FastSlideEvent();
9864
+
9798
9865
  var bClearDrawPicture=true;
9799
9866
  if (this.CurrentChartDrawPicture)
9800
9867
  {
@@ -9833,6 +9900,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9833
9900
  this.OnTouchFinished();
9834
9901
  this.TouchDrawCount=0;
9835
9902
  this.PhonePinch=null;
9903
+ this.TouchDrag=null;
9836
9904
  }
9837
9905
 
9838
9906
  this.OnTouchDBClick=function(points)
@@ -10787,6 +10855,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10787
10855
  {
10788
10856
  if (this.TouchStatus.CorssCursorShow==true) this.ChartCorssCursor.Draw();
10789
10857
  }
10858
+ else if (this.EnableClickModel)
10859
+ {
10860
+ if (this.ClickModel.IsShowCorssCursor===true) this.ChartCorssCursor.Draw();
10861
+ }
10790
10862
  else if (this.IsOnTouch===false && this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.IsShowCorssCursor===true) //开始绘图
10791
10863
  {
10792
10864
  this.ChartCorssCursor.Draw();
@@ -15646,6 +15718,43 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
15646
15718
 
15647
15719
  return true;
15648
15720
  }
15721
+
15722
+ //快速滑动
15723
+ this.FastSlideEvent=function()
15724
+ {
15725
+ if (!this.TouchDrag) return false;
15726
+ if (!this.FastSlideConfig) return false;
15727
+ var config=this.FastSlideConfig;
15728
+ if (!config.Enable) return false;
15729
+
15730
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_TOUCH_FAST_SLIDE);
15731
+ if (!event || !event.Callback) return false;
15732
+
15733
+
15734
+ var drag=this.TouchDrag;
15735
+ var time=Date.now();
15736
+ var spanTime=time-drag.StartTime;
15737
+ if (spanTime>config.MaxTime) return false;
15738
+
15739
+ if (!drag.Click || !drag.LastMove) return false;
15740
+
15741
+ var xStart=drag.Click.X;
15742
+ var xEnd=drag.LastMove.X;
15743
+
15744
+ if (!IFrameSplitOperator.IsNumber(xStart) || !IFrameSplitOperator.IsNumber(xEnd)) return false;
15745
+
15746
+ var distance=xEnd-xStart;
15747
+ var speed=Math.abs(distance)/spanTime;
15748
+ JSConsole.Chart.Log(`[JSChartContainer:FastSlideEvent] speed=${speed}, distance=${distance}, spanTime=${spanTime}`);
15749
+
15750
+ if (Math.abs(distance)<config.MinDistance) return false;
15751
+ if (speed<config.MinSpeed) return false;
15752
+
15753
+ var sendData={ Speed:speed, Distance:distance, IsLeft:distance<0?true:false }
15754
+ event.Callback(event, sendData, this);
15755
+
15756
+ return true;
15757
+ }
15649
15758
  }
15650
15759
 
15651
15760
  function GetDevicePixelRatio()
@@ -44204,7 +44313,7 @@ function ChartMinuteBuySellBar()
44204
44313
  this.BuyColor=g_JSChartResource.Minute.BuySellBar.BuyColor;
44205
44314
  this.SellColor=g_JSChartResource.Minute.BuySellBar.SellColor;
44206
44315
  this.BarWidth=g_JSChartResource.Minute.BuySellBar.BarWidth;
44207
- this.MaxBarWidth=g_JSChartResource.Minute.BuySellBar.MaxBarWidth;
44316
+ this.AryBarRange=g_JSChartResource.Minute.BuySellBar.AryBarRange;
44208
44317
  this.YOffset=g_JSChartResource.Minute.BuySellBar.YOffset;
44209
44318
  this.Font=g_JSChartResource.Minute.BuySellBar.Font;
44210
44319
  this.TextColor=g_JSChartResource.Minute.BuySellBar.TextColor;
@@ -44219,7 +44328,7 @@ function ChartMinuteBuySellBar()
44219
44328
  this.BuyColor=g_JSChartResource.Minute.BuySellBar.BuyColor;
44220
44329
  this.SellColor=g_JSChartResource.Minute.BuySellBar.SellColor;
44221
44330
  this.BarWidth=g_JSChartResource.Minute.BuySellBar.BarWidth;
44222
- this.MaxBarWidth=g_JSChartResource.Minute.BuySellBar.MaxBarWidth;
44331
+ this.AryBarRange=g_JSChartResource.Minute.BuySellBar.AryBarRange;
44223
44332
  this.YOffset=g_JSChartResource.Minute.BuySellBar.YOffset;
44224
44333
  this.Font=g_JSChartResource.Minute.BuySellBar.Font;
44225
44334
  this.TextColor=g_JSChartResource.Minute.BuySellBar.TextColor;
@@ -44235,11 +44344,29 @@ function ChartMinuteBuySellBar()
44235
44344
  var volRange=this.GetVolRange();
44236
44345
  if (!volRange) return;
44237
44346
 
44347
+ var minData=this.HQChart.GetKData();
44348
+ if (!minData || !IFrameSplitOperator.IsNonEmptyArray(minData.Data)) return;
44349
+
44238
44350
  var bHScreen=(this.ChartFrame.IsHScreen===true);
44239
44351
  var xPointCount=this.ChartFrame.XPointCount;
44352
+ var minuteCount=this.ChartFrame.MinuteCount;
44353
+ var minIndex=(minData.Data.length-1)%minuteCount;
44354
+
44355
+ var startIndex=xPointCount-1-120;
44356
+ var endIndex=xPointCount-1;
44357
+ for(var i=0;i<this.AryBarRange.length;++i)
44358
+ {
44359
+ var item=this.AryBarRange[i];
44360
+ if (minIndex<(minuteCount-1-item.End))
44361
+ {
44362
+ startIndex=xPointCount-1-item.Start;
44363
+ endIndex=xPointCount-1-item.End;
44364
+ break;
44365
+ }
44366
+ }
44240
44367
 
44241
- var xStart=this.ChartFrame.GetXFromIndex(xPointCount-this.MaxBarWidth);
44242
- var xEnd=this.ChartFrame.GetXFromIndex(xPointCount-1);
44368
+ var xStart=this.ChartFrame.GetXFromIndex(startIndex);
44369
+ var xEnd=this.ChartFrame.GetXFromIndex(endIndex);
44243
44370
 
44244
44371
  function _Temp_GetXFromData(value)
44245
44372
  {
@@ -59835,6 +59962,12 @@ function ChartCorssCursor()
59835
59962
  Icon:g_JSChartResource.CorssCursor.RightButton.Icon
59836
59963
  };
59837
59964
 
59965
+ //底部按钮
59966
+ this.BottomButton=
59967
+ {
59968
+ Enable:false, Rect:null,
59969
+ }
59970
+
59838
59971
  this.RightMargin=CloneData(g_JSChartResource.CorssCursor.RightMargin);
59839
59972
  this.BottomConfig=CloneData(g_JSChartResource.CorssCursor.BottomText); //底部输出配置
59840
59973
  this.LeftConfig=CloneData(g_JSChartResource.CorssCursor.LeftText);
@@ -60038,6 +60171,7 @@ function ChartCorssCursor()
60038
60171
  {
60039
60172
  this.Status=0;
60040
60173
  this.RightButton.Rect=null;
60174
+ this.BottomButton.Rect=null;
60041
60175
  this.LastValue=null;
60042
60176
 
60043
60177
  if (!this.LastPoint) return;
@@ -60443,6 +60577,11 @@ function ChartCorssCursor()
60443
60577
  this.Canvas.textBaseline="bottom";
60444
60578
  this.Canvas.fillStyle=this.TextColor;
60445
60579
  this.Canvas.fillText(text,rtBG.Left+textOffset.X,rtBG.Bottom+textOffset.Y,textWidth);
60580
+
60581
+ var buttonData={X:x, Y:y, XValue:xValue, FrameID:yValueExtend.FrameID };
60582
+ if (this.StringFormatX.KItem) buttonData.KItem=this.StringFormatX.KItem;
60583
+ this.BottomButton.Rect=rtBG;
60584
+ this.BottomButton.Data=buttonData;
60446
60585
  }
60447
60586
  }
60448
60587
 
@@ -60662,17 +60801,42 @@ function ChartCorssCursor()
60662
60801
  }
60663
60802
 
60664
60803
  this.PtInButton=function(x,y)
60804
+ {
60805
+ var item=this.PtInRightButton(x,y);
60806
+ if (item) return item;
60807
+
60808
+ item=this.PtInButtomButton(x,y);
60809
+ if (item) return item;
60810
+
60811
+ return null;
60812
+ }
60813
+
60814
+ this.PtInRightButton=function(x,y)
60665
60815
  {
60666
60816
  if (!this.RightButton.Enable) return null;
60667
60817
  if (!this.RightButton.Rect) return null;
60668
60818
 
60669
60819
  var rect=this.RightButton.Rect;
60670
- this.Canvas.beginPath();
60671
- this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);
60672
- if (this.Canvas.isPointInPath(x,y))
60820
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
60673
60821
  {
60674
- return { Data:this.RightButton.Data, Rect:rect };
60822
+ return { Data:this.RightButton.Data, Rect:rect, Type:1 }; //Type:1=右侧 2=底部
60675
60823
  }
60824
+
60825
+ return null;
60826
+ }
60827
+
60828
+ this.PtInButtomButton=function(x,y)
60829
+ {
60830
+ if (!this.BottomButton.Enable) return null;
60831
+ if (!this.BottomButton.Rect) return null;
60832
+
60833
+ var rect=this.BottomButton.Rect;
60834
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
60835
+ {
60836
+ return { Data:this.BottomButton.Data, Rect:rect , Type:2 }; //Type:1=右侧 2=底部
60837
+ }
60838
+
60839
+ return null;
60676
60840
  }
60677
60841
 
60678
60842
  this.DrawTextBGRect=function(x,y, height, width)
@@ -61720,9 +61884,11 @@ function HQDateStringFormat()
61720
61884
 
61721
61885
  this.DateFormatType=0; //0=YYYY-MM-DD 1=YYYY/MM/DD 2=YYYY/MM/DD/W 3=DD/MM/YYYY
61722
61886
  this.LanguageID=0;
61887
+ this.KItem=null; //缓存当前的K线
61723
61888
 
61724
61889
  this.Operator=function()
61725
61890
  {
61891
+ this.KItem=null;
61726
61892
  if (!IFrameSplitOperator.IsNumber(this.Value)) return false;
61727
61893
  if (!this.Data) return false;
61728
61894
 
@@ -61730,6 +61896,7 @@ function HQDateStringFormat()
61730
61896
  index=parseInt(index.toFixed(0));
61731
61897
  if (this.Data.DataOffset+index>=this.Data.Data.length) return false;
61732
61898
  var currentData = this.Data.Data[this.Data.DataOffset+index];
61899
+ this.KItem=currentData;
61733
61900
  var dateFormatString="YYYY-MM-DD";
61734
61901
  if (this.DateFormatType==1) dateFormatString="YYYY/MM/DD";
61735
61902
  else if (this.DateFormatType==2) dateFormatString="YYYY/MM/DD/W";
@@ -77909,6 +78076,8 @@ function JSChartResource()
77909
78076
  YOffset:1,
77910
78077
  Font:`${12*GetDevicePixelRatio()}px 微软雅黑`,
77911
78078
  TextColor:"rgb(128,128,128)",
78079
+
78080
+ AryBarRange:[{ Start:240, End:120 }, { Start:120, End:0}],
77912
78081
  }
77913
78082
 
77914
78083
  this.DefaultTextColor="rgb(43,54,69)"; //图形中默认的字体颜色
@@ -79459,7 +79628,7 @@ function JSChartResource()
79459
79628
  if (item.Font) dest.Font=item.Font;
79460
79629
  if (item.TextColor) dest.TextColor=item.TextColor;
79461
79630
  if (IFrameSplitOperator.IsNumber(item.BarWidth)) dest.BarWidth=item.BarWidth;
79462
- if (IFrameSplitOperator.IsNumber(item.MaxBarWidth)) dest.MaxBarWidth=item.MaxBarWidth;
79631
+ if (IFrameSplitOperator.IsNonEmptyArray(item.AryBarRange)) dest.AryBarRange=item.AryBarRange;
79463
79632
  if (IFrameSplitOperator.IsNumber(item.YOffset)) dest.YOffset=item.YOffset;
79464
79633
  }
79465
79634
  }
@@ -82672,33 +82841,179 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82672
82841
  return;
82673
82842
  }
82674
82843
 
82844
+ return this.ChartOperator_Temp_SetChartCorssCursor(findIndex, item);
82845
+ }
82846
+ else if (id==JSCHART_OPERATOR_ID.OP_MOVE_CORSSCURSOR) //移动十字光标 { Step, Start:{ Date, Time }}
82847
+ {
82848
+ if (!IFrameSplitOperator.IsNumber(obj.Step)) return false;
82849
+ if (obj.Step==0) return false;
82850
+ var step=obj.Step;
82851
+
82675
82852
  if (!this.Frame || !this.Frame.SubFrame[0] || !this.Frame.SubFrame[0].Frame) return false;
82676
- var frame=this.Frame.SubFrame[0].Frame;
82853
+ var showCount=this.Frame.SubFrame[0].Frame.XPointCount; //一屏显示个数
82677
82854
 
82678
- var x=frame.GetXFromIndex(findIndex);
82679
- var y=frame.GetYFromData(item.Close);
82855
+ var kData=this.GetKData();
82856
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false; //数据还没有到达
82680
82857
 
82681
- //保存最后一次鼠标移动信息
82682
- var MoveStatus={ X:x, Y:y, IsInClient: this.IsMouseOnClient(x,y) };
82683
- this.LastMouseStatus.OnMouseMove=MoveStatus;
82684
- this.LastMouseStatus.MoveOnPoint={X:x, Y:y}; //鼠标移动的位置
82858
+ var start=kData.DataOffset;
82859
+ var bDayPeriod=ChartData.IsDayPeriod(this.Period,true);
82860
+ var findItem=null, dataIndex=-1;
82861
+ for(var i=0; i<kData.Data.length; ++i)
82862
+ {
82863
+ var item=kData.Data[i];
82864
+ if (!item) continue;
82685
82865
 
82686
- var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_MOUSE_MOVE);
82687
- var titleChart=this.TitlePaint[0];
82688
- if (event && titleChart) titleChart.OnMouseMoveEvent=event;
82866
+ if (bDayPeriod)
82867
+ {
82868
+ if (item.Date==obj.Start.Date)
82869
+ {
82870
+ findItem=item;
82871
+ dataIndex=i;
82872
+ break;
82873
+ }
82874
+ }
82875
+ else
82876
+ {
82877
+ if (item.Date==obj.Start.Date && item.Time==obj.Start.Time)
82878
+ {
82879
+ findItem=item;
82880
+ dataIndex=i;
82881
+ break;
82882
+ }
82883
+ }
82884
+ }
82689
82885
 
82690
- var pixelTatio = GetDevicePixelRatio();
82886
+ if (!findItem) return false;
82691
82887
 
82692
- var e={};
82693
- e.clientX=(x/pixelTatio)+this.UIElement.getBoundingClientRect().left;
82694
- e.clientY=(y/pixelTatio)+this.UIElement.getBoundingClientRect().top;
82695
- this.MoveOnPoint={X:x, Y:y};
82696
- this.OnMouseMove(x,y,e);
82697
- this.LastMouseStatus.MoveOnPoint=null;
82698
- if (titleChart) titleChart.OnMouseMoveEvent=null;
82888
+ var index=-1;
82889
+ var dataOffset=kData.DataOffset;
82890
+ if (dataIndex>=start && dataIndex<=start+(showCount-1))
82891
+ {
82892
+ index=dataIndex-start;
82893
+ }
82894
+ else //需要调整当前屏范围
82895
+ {
82896
+ if (step>0)
82897
+ {
82898
+ if (dataIndex+showCount>=kData.Data.length)
82899
+ {
82900
+ dataOffset=kData.Data.length-showCount;
82901
+ index=dataIndex-dataOffset;
82902
+ }
82903
+ else
82904
+ {
82905
+ index=0;
82906
+ dataOffset=dataIndex;
82907
+ }
82908
+ }
82909
+ else
82910
+ {
82911
+ if (dataIndex-showCount<0)
82912
+ {
82913
+ dataOffset=0;
82914
+ index=dataIndex;
82915
+ }
82916
+ else if (dataIndex+showCount>=kData.Data.length)
82917
+ {
82918
+ dataOffset=kData.Data.length-showCount;
82919
+ index=dataIndex-dataOffset;
82920
+ }
82921
+ else
82922
+ {
82923
+ index=showCount;
82924
+ dataOffset=dataIndex-showCount;
82925
+ }
82926
+ }
82927
+ }
82928
+
82929
+ var kItem=findItem;
82930
+ if (step>0)
82931
+ {
82932
+ for(var i=dataIndex+1, j=0; i<kData.Data.length && j<step; ++i, ++j)
82933
+ {
82934
+ ++index;
82935
+ dataIndex=i;
82936
+ if (index>=(showCount-1))
82937
+ {
82938
+ index=showCount-1;
82939
+ dataOffset+=1;
82940
+ }
82941
+
82942
+ var item=kData.Data[i];
82943
+ if (!item) continue;
82944
+
82945
+ var kItem=item;
82946
+ }
82947
+ }
82948
+ else if (step<0)
82949
+ {
82950
+ for(var i=dataIndex-1, j=0;i>=0 && j<Math.abs(step);--i, ++j)
82951
+ {
82952
+ --index
82953
+ dataIndex=i;
82954
+ if (index<=0)
82955
+ {
82956
+ index=0;
82957
+ dataOffset-=1;
82958
+ }
82959
+
82960
+ var item=kData.Data[i];
82961
+ if (!item) continue;
82962
+ var kItem=item;
82963
+ }
82964
+ }
82965
+
82966
+ if (!kItem) return false;
82967
+
82968
+ obj.KItem=kItem;
82969
+ if (kData.DataOffset==dataOffset)
82970
+ {
82971
+ return this.ChartOperator_Temp_SetChartCorssCursor(index, kItem);
82972
+ }
82973
+ else
82974
+ {
82975
+ kData.DataOffset=dataOffset
82976
+ this.UpdataDataoffset(); //更新数据偏移
82977
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
82978
+ this.ResetFrameXSplit();
82979
+ this.Frame.SetSizeChage(true);
82980
+ this.Draw();
82981
+ this.ChartOperator_Temp_SetChartCorssCursor(index, kItem);
82982
+ return true;
82983
+ }
82699
82984
  }
82700
82985
  }
82701
82986
 
82987
+
82988
+ this.ChartOperator_Temp_SetChartCorssCursor=function(index, kItem)
82989
+ {
82990
+ if (!this.Frame || !this.Frame.SubFrame[0] || !this.Frame.SubFrame[0].Frame) return false;
82991
+ var frame=this.Frame.SubFrame[0].Frame;
82992
+
82993
+ var x=frame.GetXFromIndex(index);
82994
+ var y=frame.GetYFromData(kItem.Close);
82995
+
82996
+ //保存最后一次鼠标移动信息
82997
+ var MoveStatus={ X:x, Y:y, IsInClient: this.IsMouseOnClient(x,y) };
82998
+ this.LastMouseStatus.OnMouseMove=MoveStatus;
82999
+ this.LastMouseStatus.MoveOnPoint={X:x, Y:y}; //鼠标移动的位置
83000
+
83001
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_MOUSE_MOVE);
83002
+ var titleChart=this.TitlePaint[0];
83003
+ if (event && titleChart) titleChart.OnMouseMoveEvent=event;
83004
+
83005
+ var pixelTatio = GetDevicePixelRatio();
83006
+ var e={ };
83007
+ e.clientX=(x/pixelTatio)+this.UIElement.getBoundingClientRect().left;
83008
+ e.clientY=(y/pixelTatio)+this.UIElement.getBoundingClientRect().top;
83009
+ this.MoveOnPoint={X:x, Y:y};
83010
+ this.OnMouseMove(x,y,e);
83011
+ this.LastMouseStatus.MoveOnPoint=null;
83012
+ if (titleChart) titleChart.OnMouseMoveEvent=null;
83013
+
83014
+ return true;
83015
+ }
83016
+
82702
83017
  //内部函数
82703
83018
  this.ChartOperator_Temp_GetHistoryData=function()
82704
83019
  {
@@ -86882,7 +87197,8 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86882
87197
  {
86883
87198
  if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)
86884
87199
  {
86885
- if (this.TouchStatus.CorssCursorShow==true && this.TouchDrawCount>0) return;
87200
+ if (this.ClickModel.IsShowCorssCursor==true && this.ClickModel.PreventHide) return;
87201
+ if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0 ) return;
86886
87202
 
86887
87203
  this.TouchStatus.CorssCursorShow=false;
86888
87204
  this.DrawDynamicInfo();
@@ -86891,7 +87207,8 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86891
87207
 
86892
87208
  if (this.EnableClickModel===true)
86893
87209
  {
86894
- if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0) return;
87210
+ if (this.ClickModel.IsShowCorssCursor==true && this.ClickModel.PreventHide) return; //阻止隐藏
87211
+ if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0 ) return;
86895
87212
 
86896
87213
  this.ClickModel.IsShowCorssCursor=false;
86897
87214
  this.DrawDynamicInfo();
@@ -91692,13 +92009,16 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91692
92009
  this.IsOnTouch=true;
91693
92010
  this.TouchDrawCount=0;
91694
92011
  this.PhonePinch=null;
92012
+ this.TouchDrag=null;
92013
+ if (this.ClickModel) this.ClickModel.PreventHide=false;
91695
92014
  this.StopDragTimer();
91696
92015
 
91697
92016
  if (this.EnableScrollUpDown==false) e.preventDefault(); //上下拖动图形不能阻止事件
91698
92017
 
91699
92018
  if (this.IsPhoneDragging(e))
91700
92019
  {
91701
- var drag= { Click:{}, LastMove:{} };//LastMove=最后移动的位置
92020
+ var drag= { Click:{}, LastMove:{}, StartTime:Date.now() };//LastMove=最后移动的位置 StartTime=开始时间
92021
+ var touchDrag={ Click:{}, LastMove:{}, StartTime:Date.now() };
91702
92022
  var touches=this.GetToucheData(e,this.IsForceLandscape);
91703
92023
  var pt=this.PointAbsoluteToRelative(touches[0].clientX, touches[0].clientY, true);
91704
92024
 
@@ -91724,6 +92044,12 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91724
92044
  drag.Click.Y=touches[0].clientY;
91725
92045
  drag.LastMove.X=touches[0].clientX;
91726
92046
  drag.LastMove.Y=touches[0].clientY;
92047
+
92048
+ touchDrag.Click.X=touches[0].clientX;
92049
+ touchDrag.Click.Y=touches[0].clientY;
92050
+ touchDrag.LastMove.X=touches[0].clientX;
92051
+ touchDrag.LastMove.Y=touches[0].clientY;
92052
+
91727
92053
  var self=this;
91728
92054
 
91729
92055
  var T_ShowCorssCursor=function() //临时函数(Temp_) T_开头
@@ -91804,6 +92130,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91804
92130
  }
91805
92131
 
91806
92132
  this.MouseDrag=drag;
92133
+ this.TouchDrag=touchDrag;
91807
92134
  this.PhoneTouchInfo={ Start:{X:touches[0].clientX, Y:touches[0].clientY }, End:{ X:touches[0].clientX, Y:touches[0].clientY } };
91808
92135
  this.SelectChartDrawPicture=null;
91809
92136
 
@@ -91850,11 +92177,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91850
92177
  }
91851
92178
  else if (this.IsPhonePinching(e))
91852
92179
  {
91853
- var phonePinch=
91854
- {
91855
- "Start":{},
91856
- "Last":{}
91857
- };
92180
+ var phonePinch= { Start:{}, Last:{}, StartTime:Date.now() };
91858
92181
 
91859
92182
  var touches=this.GetToucheData(e,this.IsForceLandscape);
91860
92183
 
@@ -91946,6 +92269,13 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91946
92269
  this.PhoneTouchInfo.End.X=touches[0].clientX;
91947
92270
  this.PhoneTouchInfo.End.Y=touches[0].clientY;
91948
92271
  }
92272
+
92273
+ if (this.TouchDrag)
92274
+ {
92275
+ var touchDrag=this.TouchDrag;
92276
+ touchDrag.LastMove.X=touches[0].clientX;
92277
+ touchDrag.LastMove.Y=touches[0].clientY;
92278
+ }
91949
92279
  }
91950
92280
  else if (this.IsPhonePinching(e))
91951
92281
  {
@@ -92003,6 +92333,8 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
92003
92333
  JSConsole.Chart.Log('[MinuteChartContainer::OnTouchEnd]',e);
92004
92334
  if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
92005
92335
 
92336
+ this.FastSlideEvent();
92337
+
92006
92338
  var bClearDrawPicture=true;
92007
92339
  if (this.CurrentChartDrawPicture)
92008
92340
  {
@@ -92038,9 +92370,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
92038
92370
  this.TouchEvent({ EventID:JSCHART_EVENT_ID.ON_PHONE_TOUCH, FunctionName:"OnTouchEnd"}, e);
92039
92371
  this.OnTouchFinished();
92040
92372
  this.TouchDrawCount=0;
92373
+ this.TouchDrag=null;
92041
92374
  }
92042
92375
 
92043
-
92376
+
92044
92377
  //键盘左右移动十字光标
92045
92378
  this.OnKeyDown=function(e)
92046
92379
  {
@@ -93146,6 +93479,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
93146
93479
  buySellBar.Name="Minute-BuySell-Bar";
93147
93480
  buySellBar.Identify="Minute-BuySell-Bar";
93148
93481
  buySellBar.BuySellData=this.BuySellData;
93482
+ buySellBar.HQChart=this;
93149
93483
  this.ChartPaint[3]=buySellBar;
93150
93484
 
93151
93485
 
@@ -95746,6 +96080,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
95746
96080
  {
95747
96081
  if (this.EnableClickModel===true)
95748
96082
  {
96083
+ if (this.ClickModel.IsShowCorssCursor==true && this.ClickModel.PreventHide) return; //阻止隐藏
95749
96084
  if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0) return;
95750
96085
 
95751
96086
  this.ClickModel.IsShowCorssCursor=false;
@@ -97968,7 +98303,7 @@ function KLineChartHScreenContainer(uielement)
97968
98303
 
97969
98304
  if (this.VerticalDrag) bStartTimer=false;
97970
98305
 
97971
- var drag= { Click:{}, LastMove:{} }; //LastMove=最后移动的位置
98306
+ var drag= { Click:{}, LastMove:{}, StartTime:Date.now() }; //LastMove=最后移动的位置
97972
98307
 
97973
98308
 
97974
98309
  //var touches=this.GetToucheData(e,false);
@@ -98065,11 +98400,7 @@ function KLineChartHScreenContainer(uielement)
98065
98400
  }
98066
98401
  else if (this.IsPhonePinching(e))
98067
98402
  {
98068
- var phonePinch=
98069
- {
98070
- "Start":{},
98071
- "Last":{}
98072
- };
98403
+ var phonePinch={ Start:{}, Last:{}, StartTime:Date.now() };
98073
98404
 
98074
98405
  var touches=this.GetToucheData(e,false);
98075
98406
 
@@ -147531,7 +147862,7 @@ function ScrollBarBGChart()
147531
147862
 
147532
147863
 
147533
147864
 
147534
- var HQCHART_VERSION="1.1.14690";
147865
+ var HQCHART_VERSION="1.1.14704";
147535
147866
 
147536
147867
  function PrintHQChartVersion()
147537
147868
  {