AirControl  1.3.0
Open Source, Modular, and Extensible Flight Simulator For Deep Learning Research
DataZoom.cs
1 /******************************************/
2 /* */
3 /* Copyright (c) 2021 monitor1394 */
4 /* https://github.com/monitor1394 */
5 /* */
6 /******************************************/
7 
8 using System.Collections.Generic;
9 using UnityEngine;
10 using UnityEngine.EventSystems;
11 using UnityEngine.UI;
12 using XUGL;
13 
14 namespace XCharts
15 {
23  [System.Serializable]
24  public class DataZoom : MainComponent
25  {
33  public enum FilterMode
34  {
41  Filter,
48  WeakFilter,
54  Empty,
59  None
60  }
64  public enum RangeMode
65  {
66  //Value,
70  Percent
71  }
72  [SerializeField] private bool m_Enable;
73  [SerializeField] private FilterMode m_FilterMode;
74  [SerializeField] private List<int> m_XAxisIndexs = new List<int>() { 0 };
75  [SerializeField] private List<int> m_YAxisIndexs = new List<int>() { };
76  [SerializeField] private bool m_SupportInside;
77  [SerializeField] private bool m_SupportInsideScroll = true;
78  [SerializeField] private bool m_SupportInsideDrag = true;
79  [SerializeField] private bool m_SupportSlider;
80  [SerializeField] private bool m_SupportSelect;
81  [SerializeField] private bool m_ShowDataShadow;
82  [SerializeField] private bool m_ShowDetail;
83  [SerializeField] private bool m_ZoomLock;
84  [SerializeField] private bool m_Realtime;
85  [SerializeField] protected Color32 m_FillerColor;
86  [SerializeField] protected Color32 m_BorderColor;
87  [SerializeField] protected float m_BorderWidth;
88  [SerializeField] protected Color32 m_BackgroundColor;
89  [SerializeField] private float m_Left;
90  [SerializeField] private float m_Right;
91  [SerializeField] private float m_Top;
92  [SerializeField] private float m_Bottom;
93  [SerializeField] private RangeMode m_RangeMode;
94  [SerializeField] private float m_Start;
95  [SerializeField] private float m_End;
96  [SerializeField] private float m_StartValue;
97  [SerializeField] private float m_EndValue;
98  [SerializeField] private int m_MinShowNum = 1;
99  [Range(1f, 20f)]
100  [SerializeField] private float m_ScrollSensitivity = 1.1f;
101  [SerializeField] private Orient m_Orient = Orient.Horizonal;
102  [SerializeField] private TextStyle m_TextStyle;
103  [SerializeField] private LineStyle m_LineStyle = new LineStyle(LineStyle.Type.Solid);
104  [SerializeField] private AreaStyle m_AreaStyle = new AreaStyle();
105 
110  public bool enable
111  {
112  get { return m_Enable; }
113  set { if (PropertyUtil.SetStruct(ref m_Enable, value)) SetVerticesDirty(); }
114  }
119  public FilterMode filterMode
120  {
121  get { return m_FilterMode; }
122  set { if (PropertyUtil.SetStruct(ref m_FilterMode, value)) SetVerticesDirty(); }
123  }
128  public List<int> xAxisIndexs
129  {
130  get { return m_XAxisIndexs; }
131  set { if (PropertyUtil.SetClass(ref m_XAxisIndexs, value)) SetVerticesDirty(); }
132  }
137  public List<int> yAxisIndexs
138  {
139  get { return m_YAxisIndexs; }
140  set { if (PropertyUtil.SetClass(ref m_YAxisIndexs, value)) SetVerticesDirty(); }
141  }
149  public bool supportInside
150  {
151  get { return m_SupportInside; }
152  set { if (PropertyUtil.SetStruct(ref m_SupportInside, value)) SetVerticesDirty(); }
153  }
157  public bool supportInsideScroll
158  {
159  get { return m_SupportInsideScroll; }
160  set { if (PropertyUtil.SetStruct(ref m_SupportInsideScroll, value)) SetVerticesDirty(); }
161  }
165  public bool supportInsideDrag
166  {
167  get { return m_SupportInsideDrag; }
168  set { if (PropertyUtil.SetStruct(ref m_SupportInsideDrag, value)) SetVerticesDirty(); }
169  }
174  public bool supportSlider
175  {
176  get { return m_SupportSlider; }
177  set { if (PropertyUtil.SetStruct(ref m_SupportSlider, value)) SetVerticesDirty(); }
178  }
182  private bool supportSelect
183  {
184  get { return m_SupportSelect; }
185  set { if (PropertyUtil.SetStruct(ref m_SupportSelect, value)) SetVerticesDirty(); }
186  }
192  public bool showDataShadow
193  {
194  get { return m_ShowDataShadow; }
195  set { if (PropertyUtil.SetStruct(ref m_ShowDataShadow, value)) SetVerticesDirty(); }
196  }
202  public bool showDetail
203  {
204  get { return m_ShowDetail; }
205  set { if (PropertyUtil.SetStruct(ref m_ShowDetail, value)) SetVerticesDirty(); }
206  }
213  public bool zoomLock
214  {
215  get { return m_ZoomLock; }
216  set { if (PropertyUtil.SetStruct(ref m_ZoomLock, value)) SetVerticesDirty(); }
217  }
223  public bool realtime { get { return true; } }
228  public Color backgroundColor
229  {
230  get { return m_BackgroundColor; }
231  set { if (PropertyUtil.SetStruct(ref m_BackgroundColor, value)) SetVerticesDirty(); }
232  }
237  public Color32 fillerColor
238  {
239  get { return m_FillerColor; }
240  set { if (PropertyUtil.SetColor(ref m_FillerColor, value)) SetVerticesDirty(); }
241  }
242 
247  public Color32 borderColor
248  {
249  get { return m_BorderColor; }
250  set { if (PropertyUtil.SetColor(ref m_BorderColor, value)) SetComponentDirty(); }
251  }
255  public float borderWidth
256  {
257  get { return m_BorderWidth; }
258  set { if (PropertyUtil.SetStruct(ref m_BorderWidth, value)) SetComponentDirty(); }
259  }
266  public float bottom
267  {
268  get { return m_Bottom; }
269  set { if (PropertyUtil.SetStruct(ref m_Bottom, value)) SetVerticesDirty(); }
270  }
277  public float top
278  {
279  get { return m_Top; }
280  set { if (PropertyUtil.SetStruct(ref m_Top, value)) SetVerticesDirty(); }
281  }
288  public float left
289  {
290  get { return m_Left; }
291  set { if (PropertyUtil.SetStruct(ref m_Left, value)) SetVerticesDirty(); }
292  }
299  public float right
300  {
301  get { return m_Right; }
302  set { if (PropertyUtil.SetStruct(ref m_Right, value)) SetVerticesDirty(); }
303  }
309  public RangeMode rangeMode
310  {
311  get { return m_RangeMode; }
312  set { if (PropertyUtil.SetStruct(ref m_RangeMode, value)) SetVerticesDirty(); }
313  }
319  public float start
320  {
321  get { return m_Start; }
322  set { m_Start = value; if (m_Start < 0) m_Start = 0; if (m_Start > 100) m_Start = 100; SetVerticesDirty(); }
323  }
329  public float end
330  {
331  get { return m_End; }
332  set { m_End = value; if (m_End < 0) m_End = 0; if (m_End > 100) m_End = 100; SetVerticesDirty(); }
333  }
338  public int minShowNum
339  {
340  get { return m_MinShowNum; }
341  set { if (PropertyUtil.SetStruct(ref m_MinShowNum, value)) SetVerticesDirty(); }
342  }
349  public float scrollSensitivity
350  {
351  get { return m_ScrollSensitivity; }
352  set { if (PropertyUtil.SetStruct(ref m_ScrollSensitivity, value)) SetVerticesDirty(); }
353  }
354 
361  public Orient orient
362  {
363  get { return m_Orient; }
364  set { if (PropertyUtil.SetStruct(ref m_Orient, value)) SetVerticesDirty(); }
365  }
370  public TextStyle textStyle
371  {
372  get { return m_TextStyle; }
373  set { if (PropertyUtil.SetClass(ref m_TextStyle, value)) SetComponentDirty(); }
374  }
378  public LineStyle lineStyle
379  {
380  get { return m_LineStyle; }
381  set { if (PropertyUtil.SetClass(ref m_LineStyle, value)) SetComponentDirty(); }
382  }
386  public AreaStyle areaStyle
387  {
388  get { return m_AreaStyle; }
389  set { if (PropertyUtil.SetClass(ref m_AreaStyle, value)) SetComponentDirty(); }
390  }
391  public int index { get; internal set; }
392  public float runtimeX { get; private set; }
393  public float runtimeY { get; private set; }
394  public float runtimeWidth { get; private set; }
395  public float runtimeHeight { get; private set; }
396  public bool runtimeDrag { get; internal set; }
397  public bool runtimeCoordinateDrag { get; internal set; }
398  public bool runtimeStartDrag { get; internal set; }
399  public bool runtimeEndDrag { get; internal set; }
403  public double runtimeStartValue { get; internal set; }
407  public double runtimeEndValue { get; internal set; }
408  public bool runtimeInvert { get; set; }
409 
410  class AxisIndexValueInfo
411  {
412  public double min;
413  public double max;
414  }
415  private Dictionary<int, AxisIndexValueInfo> m_XAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
416  private Dictionary<int, AxisIndexValueInfo> m_YAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
417 
422  private ChartText m_StartLabel { get; set; }
427  private ChartText m_EndLabel { get; set; }
428 
429  public static DataZoom defaultDataZoom
430  {
431  get
432  {
433  return new DataZoom()
434  {
435  supportInside = true,
436  supportSlider = true,
437  filterMode = FilterMode.None,
438  xAxisIndexs = new List<int>() { 0 },
439  yAxisIndexs = new List<int>() { },
440  showDataShadow = true,
441  showDetail = false,
442  zoomLock = false,
443  m_Bottom = 10,
444  m_Left = 10,
445  m_Right = 10,
446  m_Top = 0.9f,
447  rangeMode = RangeMode.Percent,
448  start = 30,
449  end = 70,
450  m_Orient = Orient.Horizonal,
451  m_ScrollSensitivity = 10,
452  m_TextStyle = new TextStyle(),
453  m_LineStyle = new LineStyle(LineStyle.Type.Solid)
454  {
455  opacity = 0.3f
456  },
457  m_AreaStyle = new AreaStyle()
458  {
459  show = true,
460  opacity = 0.3f,
461  },
462  };
463  }
464  }
465 
473  public bool IsInZoom(Vector2 pos)
474  {
475  if (pos.x < runtimeX - 1 || pos.x > runtimeX + runtimeWidth + 1 ||
476  pos.y < runtimeY - 1 || pos.y > runtimeY + runtimeHeight + 1)
477  {
478  return false;
479  }
480  return true;
481  }
482 
488  public bool IsInSelectedZoom(Vector2 pos)
489  {
490  switch (m_Orient)
491  {
492  case Orient.Horizonal:
493  var start = runtimeX + runtimeWidth * m_Start / 100;
494  var end = runtimeX + runtimeWidth * m_End / 100;
495  return ChartHelper.IsInRect(pos, start, end, runtimeY, runtimeY + runtimeHeight);
496  case Orient.Vertical:
497  start = runtimeY + runtimeHeight * m_Start / 100;
498  end = runtimeY + runtimeHeight * m_End / 100;
499  return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth, start, end);
500  default: return false;
501  }
502  }
503 
504 
505  public bool IsInSelectedZoom(int totalIndex, int index, bool invert)
506  {
507  if (totalIndex <= 0) return false;
508  var tstart = invert ? 100 - end : start;
509  var tend = invert ? 100 - start : end;
510  var range = Mathf.RoundToInt(totalIndex * (tend - tstart) / 100);
511  var min = Mathf.FloorToInt(totalIndex * tstart / 100);
512  var max = Mathf.CeilToInt(totalIndex * tend / 100);
513  if (min == 0) max = min + range;
514  if (max == totalIndex) min = max - range;
515  var flag = index >= min && index < min + range;
516  //Debug.LogError("check:" + index + "," + totalIndex + "," + range + "," + min + "," + max + "," + flag);
517  return flag;
518  }
519 
527  public bool IsInStartZoom(Vector2 pos)
528  {
529  switch (m_Orient)
530  {
531  case Orient.Horizonal:
532  var start = runtimeX + runtimeWidth * m_Start / 100;
533  return ChartHelper.IsInRect(pos, start - 10, start + 10, runtimeY, runtimeY + runtimeHeight);
534  case Orient.Vertical:
535  start = runtimeY + runtimeHeight * m_Start / 100;
536  return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth, start - 10, start + 10);
537  default: return false;
538  }
539  }
540 
548  public bool IsInEndZoom(Vector2 pos)
549  {
550  switch (m_Orient)
551  {
552  case Orient.Horizonal:
553  var end = runtimeX + runtimeWidth * m_End / 100;
554  return ChartHelper.IsInRect(pos, end - 10, end + 10, runtimeY, runtimeY + runtimeHeight);
555  case Orient.Vertical:
556  end = runtimeY + runtimeHeight * m_End / 100;
557  return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth, end - 10, end + 10);
558  default: return false;
559  }
560  }
561 
562 
563  public bool IsContainsAxis(Axis axis)
564  {
565  if (axis == null) return false;
566  else if (axis is XAxis) return xAxisIndexs.Contains(axis.index);
567  else if (axis is YAxis) return yAxisIndexs.Contains(axis.index);
568  else return false;
569  }
570  public bool IsContainsXAxis(int index)
571  {
572  return xAxisIndexs != null && xAxisIndexs.Contains(index);
573  }
574 
575  public bool IsContainsYAxis(int index)
576  {
577  return yAxisIndexs != null && yAxisIndexs.Contains(index);
578  }
579 
580  public Color32 GetFillerColor(Color32 themeColor)
581  {
582  if (ChartHelper.IsClearColor(fillerColor)) return themeColor;
583  else return fillerColor;
584  }
585 
586  public Color32 GetBackgroundColor(Color32 themeColor)
587  {
588  if (ChartHelper.IsClearColor(backgroundColor)) return themeColor;
589  else return backgroundColor;
590  }
591  public Color32 GetBorderColor(Color32 themeColor)
592  {
593  if (ChartHelper.IsClearColor(borderColor)) return themeColor;
594  else return borderColor;
595  }
596 
601  internal void SetLabelActive(bool flag)
602  {
603  if (m_StartLabel != null && m_StartLabel.gameObject.activeInHierarchy != flag)
604  {
605  m_StartLabel.gameObject.SetActive(flag);
606  }
607  if (m_EndLabel != null && m_EndLabel.gameObject.activeInHierarchy != flag)
608  {
609  m_EndLabel.gameObject.SetActive(flag);
610  }
611  }
612 
617  internal void SetStartLabelText(string text)
618  {
619  if (m_StartLabel != null) m_StartLabel.SetText(text);
620  }
621 
626  internal void SetEndLabelText(string text)
627  {
628  if (m_EndLabel != null) m_EndLabel.SetText(text);
629  }
630 
631  internal void SetStartLabel(ChartText startLabel)
632  {
633  m_StartLabel = startLabel;
634  }
635 
636  internal void SetEndLabel(ChartText endLabel)
637  {
638  m_EndLabel = endLabel;
639  }
640 
641  internal void UpdateStartLabelPosition(Vector3 pos)
642  {
643  m_StartLabel.SetLocalPosition(pos);
644  }
645 
646  internal void UpdateEndLabelPosition(Vector3 pos)
647  {
648  m_EndLabel.SetLocalPosition(pos);
649  }
650 
651  internal void UpdateRuntimeData(float chartX, float chartY, float chartWidth, float chartHeight)
652  {
653  var runtimeLeft = left <= 1 ? left * chartWidth : left;
654  var runtimeBottom = bottom <= 1 ? bottom * chartHeight : bottom;
655  var runtimeTop = top <= 1 ? top * chartHeight : top;
656  var runtimeRight = right <= 1 ? right * chartWidth : right;
657  runtimeX = chartX + runtimeLeft;
658  runtimeY = chartY + runtimeBottom;
659  runtimeWidth = chartWidth - runtimeLeft - runtimeRight;
660  runtimeHeight = chartHeight - runtimeTop - runtimeBottom;
661  }
662 
663  internal void SetXAxisIndexValueInfo(int xAxisIndex, double min, double max)
664  {
665  if (!m_XAxisIndexInfos.ContainsKey(xAxisIndex))
666  {
667  m_XAxisIndexInfos[xAxisIndex] = new AxisIndexValueInfo()
668  {
669  min = min,
670  max = max
671  };
672  }
673  else
674  {
675  m_XAxisIndexInfos[xAxisIndex].min = min;
676  m_XAxisIndexInfos[xAxisIndex].max = max;
677  }
678  }
679 
680  internal void SetYAxisIndexValueInfo(int yAxisIndex, double min, double max)
681  {
682  if (!m_YAxisIndexInfos.ContainsKey(yAxisIndex))
683  {
684  m_YAxisIndexInfos[yAxisIndex] = new AxisIndexValueInfo()
685  {
686  min = min,
687  max = max
688  };
689  }
690  else
691  {
692  m_YAxisIndexInfos[yAxisIndex].min = min;
693  m_YAxisIndexInfos[yAxisIndex].max = max;
694  }
695  }
696 
697  internal bool IsXAxisIndexValue(int axisIndex)
698  {
699  return m_XAxisIndexInfos.ContainsKey(axisIndex);
700  }
701 
702  internal bool IsYAxisIndexValue(int axisIndex)
703  {
704  return m_YAxisIndexInfos.ContainsKey(axisIndex);
705  }
706 
707  internal void GetXAxisIndexValue(int axisIndex, out double min, out double max)
708  {
709  min = 0;
710  max = 0;
711  if (m_XAxisIndexInfos.ContainsKey(axisIndex))
712  {
713  var info = m_XAxisIndexInfos[axisIndex];
714  min = info.min;
715  max = info.max;
716  }
717  }
718  internal void GetYAxisIndexValue(int axisIndex, out double min, out double max)
719  {
720  min = 0;
721  max = 0;
722  if (m_YAxisIndexInfos.ContainsKey(axisIndex))
723  {
724  var info = m_YAxisIndexInfos[axisIndex];
725  min = info.min;
726  max = info.max;
727  }
728  }
729  }
730 
731 
732  internal class DataZoomHandler : IComponentHandler
733  {
734  public CoordinateChart chart;
735  private Vector2 m_LastTouchPos0;
736  private Vector2 m_LastTouchPos1;
737  private bool m_CheckDataZoomLabel;
738  private float m_DataZoomLastStartIndex;
739  private float m_DataZoomLastEndIndex;
740 
741  public DataZoomHandler(BaseChart chart)
742  {
743  this.chart = chart as CoordinateChart;
744  }
745 
746  public void Init() { }
747 
748  public void Update()
749  {
750  if (chart == null) return;
751  foreach (var dataZoom in chart.dataZooms)
752  {
753  CheckDataZoomScale(dataZoom);
754  CheckDataZoomLabel(dataZoom);
755  }
756  }
757 
758  public void DrawBase(VertexHelper vh)
759  {
760  }
761 
762  public void DrawTop(VertexHelper vh)
763  {
764  if (chart == null) return;
765  foreach (var dataZoom in chart.dataZooms)
766  {
767  switch (dataZoom.orient)
768  {
769  case Orient.Horizonal:
770  DrawHorizonalDataZoomSlider(vh, dataZoom);
771  break;
772  case Orient.Vertical:
773  DrawVerticalDataZoomSlider(vh, dataZoom);
774  break;
775  }
776  }
777  }
778 
779  public void OnBeginDrag(PointerEventData eventData)
780  {
781  if (chart == null) return;
782  if (Input.touchCount > 1) return;
783  Vector2 pos;
784  if (!chart.ScreenPointToChartPoint(eventData.position, out pos))
785  {
786  return;
787  }
788  foreach (var dataZoom in chart.dataZooms)
789  {
790  if (!dataZoom.enable) continue;
791  var grid = chart.GetDataZoomGridOrDefault(dataZoom);
792  if (dataZoom.supportInside && dataZoom.supportInsideDrag)
793  {
794  if (chart.IsInGrid(grid, pos))
795  {
796  dataZoom.runtimeCoordinateDrag = true;
797  }
798  }
799  if (dataZoom.supportSlider)
800  {
801  if (!dataZoom.zoomLock)
802  {
803  if (dataZoom.IsInStartZoom(pos))
804  {
805  dataZoom.runtimeStartDrag = true;
806  }
807  else if (dataZoom.IsInEndZoom(pos))
808  {
809  dataZoom.runtimeEndDrag = true;
810  }
811  else if (dataZoom.IsInSelectedZoom(pos))
812  {
813  dataZoom.runtimeDrag = true;
814  }
815  }
816  else if (dataZoom.IsInSelectedZoom(pos))
817  {
818  dataZoom.runtimeDrag = true;
819  }
820  }
821  }
822  }
823 
824  public void OnDrag(PointerEventData eventData)
825  {
826  if (chart == null) return;
827  if (Input.touchCount > 1) return;
828  foreach (var dataZoom in chart.dataZooms)
829  {
830  var grid = chart.GetDataZoomGridOrDefault(dataZoom);
831  switch (dataZoom.orient)
832  {
833  case Orient.Horizonal:
834  var deltaPercent = eventData.delta.x / grid.runtimeWidth * 100;
835  OnDragInside(dataZoom, deltaPercent);
836  OnDragSlider(dataZoom, deltaPercent);
837  break;
838  case Orient.Vertical:
839  deltaPercent = eventData.delta.y / grid.runtimeHeight * 100;
840  OnDragInside(dataZoom, deltaPercent);
841  OnDragSlider(dataZoom, deltaPercent);
842  break;
843  }
844  }
845  }
846 
847  public void OnEndDrag(PointerEventData eventData)
848  {
849  if (chart == null) return;
850  foreach (var dataZoom in chart.dataZooms)
851  {
852  if (dataZoom.runtimeDrag || dataZoom.runtimeStartDrag || dataZoom.runtimeEndDrag
853  || dataZoom.runtimeCoordinateDrag)
854  {
855  chart.RefreshChart();
856  }
857  dataZoom.runtimeDrag = false;
858  dataZoom.runtimeCoordinateDrag = false;
859  dataZoom.runtimeStartDrag = false;
860  dataZoom.runtimeEndDrag = false;
861  }
862  }
863  public void OnPointerDown(PointerEventData eventData)
864  {
865  if (chart == null) return;
866  if (Input.touchCount > 1) return;
867  Vector2 localPos;
868  if (!chart.ScreenPointToChartPoint(eventData.position, out localPos))
869  {
870  return;
871  }
872  foreach (var dataZoom in chart.dataZooms)
873  {
874  var grid = chart.GetDataZoomGridOrDefault(dataZoom);
875  if (dataZoom.IsInStartZoom(localPos) ||
876  dataZoom.IsInEndZoom(localPos))
877  {
878  return;
879  }
880  if (dataZoom.IsInZoom(localPos)
881  && !dataZoom.IsInSelectedZoom(localPos))
882  {
883  var pointerX = localPos.x;
884  var selectWidth = grid.runtimeWidth * (dataZoom.end - dataZoom.start) / 100;
885  var startX = pointerX - selectWidth / 2;
886  var endX = pointerX + selectWidth / 2;
887  if (startX < grid.runtimeX)
888  {
889  startX = grid.runtimeX;
890  endX = grid.runtimeX + selectWidth;
891  }
892  else if (endX > grid.runtimeX + grid.runtimeWidth)
893  {
894  endX = grid.runtimeX + grid.runtimeWidth;
895  startX = grid.runtimeX + grid.runtimeWidth - selectWidth;
896  }
897  var start = (startX - grid.runtimeX) / grid.runtimeWidth * 100;
898  var end = (endX - grid.runtimeX) / grid.runtimeWidth * 100;
899  UpdateDataZoomRange(dataZoom, start, end);
900  }
901  }
902  }
903  public void OnScroll(PointerEventData eventData)
904  {
905  if (chart == null) return;
906  if (Input.touchCount > 1) return;
907  Vector2 pos;
908  if (!chart.ScreenPointToChartPoint(eventData.position, out pos)) return;
909  foreach (var dataZoom in chart.dataZooms)
910  {
911  if (!dataZoom.enable || dataZoom.zoomLock) continue;
912  var grid = chart.GetDataZoomGridOrDefault(dataZoom);
913  if ((dataZoom.supportInside && dataZoom.supportInsideScroll && chart.IsInGrid(grid, pos)) ||
914  dataZoom.IsInZoom(pos))
915  {
916  ScaleDataZoom(dataZoom, eventData.scrollDelta.y * dataZoom.scrollSensitivity);
917  }
918  }
919  }
920 
921  private void OnDragInside(DataZoom dataZoom, float deltaPercent)
922  {
923  if (deltaPercent == 0) return;
924  if (Input.touchCount > 1) return;
925  if (!dataZoom.supportInside || !dataZoom.supportInsideDrag) return;
926  if (!dataZoom.runtimeCoordinateDrag) return;
927  var diff = dataZoom.end - dataZoom.start;
928  if (deltaPercent > 0)
929  {
930  if (dataZoom.start > 0)
931  {
932  var start = dataZoom.start - deltaPercent;
933  if (start < 0) start = 0;
934  var end = start + diff;
935  UpdateDataZoomRange(dataZoom, start, end);
936  }
937  }
938  else
939  {
940  if (dataZoom.end < 100)
941  {
942  var end = dataZoom.end - deltaPercent;
943  if (end > 100) end = 100;
944  var start = end - diff;
945  UpdateDataZoomRange(dataZoom, start, end);
946  }
947  }
948  }
949 
950  private void OnDragSlider(DataZoom dataZoom, float deltaPercent)
951  {
952  if (Input.touchCount > 1) return;
953  if (!dataZoom.supportSlider) return;
954  if (dataZoom.runtimeStartDrag)
955  {
956  var start = dataZoom.start + deltaPercent;
957  if (start > dataZoom.end)
958  {
959  start = dataZoom.end;
960  dataZoom.runtimeEndDrag = true;
961  dataZoom.runtimeStartDrag = false;
962  }
963  UpdateDataZoomRange(dataZoom, start, dataZoom.end);
964  }
965  else if (dataZoom.runtimeEndDrag)
966  {
967  var end = dataZoom.end + deltaPercent;
968  if (end < dataZoom.start)
969  {
970  end = dataZoom.start;
971  dataZoom.runtimeStartDrag = true;
972  dataZoom.runtimeEndDrag = false;
973  }
974  UpdateDataZoomRange(dataZoom, dataZoom.start, end);
975  }
976  else if (dataZoom.runtimeDrag)
977  {
978  if (deltaPercent > 0)
979  {
980  if (dataZoom.end + deltaPercent > 100) deltaPercent = 100 - dataZoom.end;
981  }
982  else
983  {
984  if (dataZoom.start + deltaPercent < 0) deltaPercent = -dataZoom.start;
985  }
986  UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end + deltaPercent);
987  }
988  }
989 
990  private void ScaleDataZoom(DataZoom dataZoom, float delta)
991  {
992  var grid = chart.GetDataZoomGridOrDefault(dataZoom);
993  var deltaPercent = dataZoom.orient == Orient.Horizonal ?
994  Mathf.Abs(delta / grid.runtimeWidth * 100) :
995  Mathf.Abs(delta / grid.runtimeHeight * 100);
996  if (delta > 0)
997  {
998  if (dataZoom.end <= dataZoom.start) return;
999  UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end - deltaPercent);
1000  }
1001  else
1002  {
1003  UpdateDataZoomRange(dataZoom, dataZoom.start - deltaPercent, dataZoom.end + deltaPercent);
1004  }
1005  }
1006 
1007  public void UpdateDataZoomRange(DataZoom dataZoom, float start, float end)
1008  {
1009  if (end > 100) end = 100;
1010  if (start < 0) start = 0;
1011  if (end < start) end = start;
1012  dataZoom.start = start;
1013  dataZoom.end = end;
1014  if (dataZoom.realtime)
1015  {
1016  chart.OnDataZoomRangeChanged(dataZoom);
1017  chart.RefreshChart();
1018  }
1019  }
1020 
1021  public void RefreshDataZoomLabel()
1022  {
1023  m_CheckDataZoomLabel = true;
1024  }
1025 
1026  private void CheckDataZoomScale(DataZoom dataZoom)
1027  {
1028  if (!dataZoom.enable || dataZoom.zoomLock || !dataZoom.supportInside || !dataZoom.supportInsideDrag) return;
1029 
1030  if (Input.touchCount == 2)
1031  {
1032  var touch0 = Input.GetTouch(0);
1033  var touch1 = Input.GetTouch(1);
1034  if (touch1.phase == TouchPhase.Began)
1035  {
1036  m_LastTouchPos0 = touch0.position;
1037  m_LastTouchPos1 = touch1.position;
1038  }
1039  else if (touch0.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)
1040  {
1041  var tempPos0 = touch0.position;
1042  var tempPos1 = touch1.position;
1043  var currDist = Vector2.Distance(tempPos0, tempPos1);
1044  var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1);
1045  var delta = (currDist - lastDist);
1046  ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity);
1047  m_LastTouchPos0 = tempPos0;
1048  m_LastTouchPos1 = tempPos1;
1049  }
1050  }
1051  }
1052 
1053  private void CheckDataZoomLabel(DataZoom dataZoom)
1054  {
1055  if (dataZoom.enable && dataZoom.supportSlider && dataZoom.showDetail)
1056  {
1057  Vector2 local;
1058  if (!chart.ScreenPointToChartPoint(Input.mousePosition, out local))
1059  {
1060  dataZoom.SetLabelActive(false);
1061  return;
1062  }
1063  if (dataZoom.IsInSelectedZoom(local)
1064  || dataZoom.IsInStartZoom(local)
1065  || dataZoom.IsInEndZoom(local))
1066  {
1067  dataZoom.SetLabelActive(true);
1068  RefreshDataZoomLabel();
1069  }
1070  else
1071  {
1072  dataZoom.SetLabelActive(false);
1073  }
1074  }
1075  if (m_CheckDataZoomLabel && dataZoom.xAxisIndexs.Count > 0)
1076  {
1077  m_CheckDataZoomLabel = false;
1078  var xAxis = chart.GetXAxis(dataZoom.xAxisIndexs[0]);
1079  var startIndex = (int)((xAxis.data.Count - 1) * dataZoom.start / 100);
1080  var endIndex = (int)((xAxis.data.Count - 1) * dataZoom.end / 100);
1081  if (m_DataZoomLastStartIndex != startIndex || m_DataZoomLastEndIndex != endIndex)
1082  {
1083  m_DataZoomLastStartIndex = startIndex;
1084  m_DataZoomLastEndIndex = endIndex;
1085  if (xAxis.data.Count > 0)
1086  {
1087  dataZoom.SetStartLabelText(xAxis.data[startIndex]);
1088  dataZoom.SetEndLabelText(xAxis.data[endIndex]);
1089  }
1090  else if (xAxis.IsTime())
1091  {
1092  //TODO:
1093  dataZoom.SetStartLabelText("");
1094  dataZoom.SetEndLabelText("");
1095  }
1096  chart.InitAxisX();
1097  }
1098  var start = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.start / 100;
1099  var end = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.end / 100;
1100  var hig = dataZoom.runtimeHeight;
1101  dataZoom.UpdateStartLabelPosition(new Vector3(start - 10, chart.chartY + dataZoom.bottom + hig / 2));
1102  dataZoom.UpdateEndLabelPosition(new Vector3(end + 10, chart.chartY + dataZoom.bottom + hig / 2));
1103  }
1104  }
1105 
1106  private void DrawHorizonalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)
1107  {
1108  if (!dataZoom.enable || !dataZoom.supportSlider) return;
1109  var p1 = new Vector3(dataZoom.runtimeX, dataZoom.runtimeY);
1110  var p2 = new Vector3(dataZoom.runtimeX, dataZoom.runtimeY + dataZoom.runtimeHeight);
1111  var p3 = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY + dataZoom.runtimeHeight);
1112  var p4 = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY);
1113  var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);
1114  var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);
1115  var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;
1116  var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);
1117  var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);
1118  var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);
1119  UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);
1120  var centerPos = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth / 2,
1121  dataZoom.runtimeY + dataZoom.runtimeHeight / 2);
1122  UGL.DrawBorder(vh, centerPos, dataZoom.runtimeWidth, dataZoom.runtimeHeight, borderWidth, borderColor);
1123  if (dataZoom.showDataShadow && chart.series.Count > 0)
1124  {
1125  Serie serie = chart.series.list[0];
1126  Axis axis = chart.GetYAxis(0);
1127  var showData = serie.GetDataList(null);
1128  float scaleWid = dataZoom.runtimeWidth / (showData.Count - 1);
1129  Vector3 lp = Vector3.zero;
1130  Vector3 np = Vector3.zero;
1131  double minValue = 0;
1132  double maxValue = 0;
1133  SeriesHelper.GetYMinMaxValue(chart.series, null, 0, chart.IsValue(), axis.inverse, out minValue, out maxValue);
1134  AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);
1135 
1136  int rate = 1;
1137  var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;
1138  var maxCount = showData.Count;
1139  if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (dataZoom.runtimeWidth / sampleDist));
1140  if (rate < 1) rate = 1;
1141  var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
1142  chart.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
1143  var dataChanging = false;
1144  for (int i = 0; i < maxCount; i += rate)
1145  {
1146  double value = chart.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
1147  serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis);
1148  float pX = dataZoom.runtimeX + i * scaleWid;
1149  float dataHig = (float)((maxValue - minValue) == 0 ? 0 :
1150  (value - minValue) / (maxValue - minValue) * dataZoom.runtimeHeight);
1151  np = new Vector3(pX, chart.chartY + dataZoom.bottom + dataHig);
1152  if (i > 0)
1153  {
1154  UGL.DrawLine(vh, lp, np, lineWidth, lineColor);
1155  Vector3 alp = new Vector3(lp.x, lp.y - lineWidth);
1156  Vector3 anp = new Vector3(np.x, np.y - lineWidth);
1157 
1158  Vector3 tnp = new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);
1159  Vector3 tlp = new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);
1160  UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);
1161  }
1162  lp = np;
1163  }
1164  if (dataChanging)
1165  {
1166  chart.RefreshTopPainter();
1167  }
1168  }
1169  switch (dataZoom.rangeMode)
1170  {
1171  case DataZoom.RangeMode.Percent:
1172  var start = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.start / 100;
1173  var end = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.end / 100;
1174  var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);
1175 
1176  p1 = new Vector2(start, dataZoom.runtimeY);
1177  p2 = new Vector2(start, dataZoom.runtimeY + dataZoom.runtimeHeight);
1178  p3 = new Vector2(end, dataZoom.runtimeY + dataZoom.runtimeHeight);
1179  p4 = new Vector2(end, dataZoom.runtimeY);
1180  UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);
1181  UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);
1182  UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);
1183  break;
1184  }
1185  }
1186 
1187  private void DrawVerticalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)
1188  {
1189  if (!dataZoom.enable || !dataZoom.supportSlider) return;
1190  var p1 = new Vector3(dataZoom.runtimeX, dataZoom.runtimeY);
1191  var p2 = new Vector3(dataZoom.runtimeX, dataZoom.runtimeY + dataZoom.runtimeHeight);
1192  var p3 = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY + dataZoom.runtimeHeight);
1193  var p4 = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY);
1194  var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);
1195  var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);
1196  var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;
1197  var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);
1198  var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);
1199  var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);
1200  UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);
1201  var centerPos = new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth / 2,
1202  dataZoom.runtimeY + dataZoom.runtimeHeight / 2);
1203  UGL.DrawBorder(vh, centerPos, dataZoom.runtimeWidth, dataZoom.runtimeHeight, borderWidth, borderColor);
1204  if (dataZoom.showDataShadow && chart.series.Count > 0)
1205  {
1206  Serie serie = chart.series.list[0];
1207  Axis axis = chart.GetYAxis(0);
1208  var showData = serie.GetDataList(null);
1209  float scaleWid = dataZoom.runtimeHeight / (showData.Count - 1);
1210  Vector3 lp = Vector3.zero;
1211  Vector3 np = Vector3.zero;
1212  double minValue = 0;
1213  double maxValue = 0;
1214  SeriesHelper.GetYMinMaxValue(chart.series, null, 0, chart.IsValue(), axis.inverse, out minValue, out maxValue);
1215  AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);
1216 
1217  int rate = 1;
1218  var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;
1219  var maxCount = showData.Count;
1220  if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (dataZoom.runtimeHeight / sampleDist));
1221  if (rate < 1) rate = 1;
1222  var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
1223  chart.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
1224  var dataChanging = false;
1225  for (int i = 0; i < maxCount; i += rate)
1226  {
1227  double value = chart.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
1228  serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis);
1229  float pY = dataZoom.runtimeY + i * scaleWid;
1230  float dataHig = (maxValue - minValue) == 0 ? 0 :
1231  (float)((value - minValue) / (maxValue - minValue) * dataZoom.runtimeWidth);
1232  np = new Vector3(chart.chartX + chart.chartWidth - dataZoom.right - dataHig, pY);
1233  if (i > 0)
1234  {
1235  UGL.DrawLine(vh, lp, np, lineWidth, lineColor);
1236  Vector3 alp = new Vector3(lp.x, lp.y - lineWidth);
1237  Vector3 anp = new Vector3(np.x, np.y - lineWidth);
1238 
1239  Vector3 tnp = new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);
1240  Vector3 tlp = new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);
1241  UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);
1242  }
1243  lp = np;
1244  }
1245  if (dataChanging)
1246  {
1247  chart.RefreshTopPainter();
1248  }
1249  }
1250  switch (dataZoom.rangeMode)
1251  {
1252  case DataZoom.RangeMode.Percent:
1253  var start = dataZoom.runtimeY + dataZoom.runtimeHeight * dataZoom.start / 100;
1254  var end = dataZoom.runtimeY + dataZoom.runtimeHeight * dataZoom.end / 100;
1255  var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);
1256 
1257  p1 = new Vector2(dataZoom.runtimeX, start);
1258  p2 = new Vector2(dataZoom.runtimeX + dataZoom.runtimeWidth, start);
1259  p3 = new Vector2(dataZoom.runtimeX + dataZoom.runtimeWidth, end);
1260  p4 = new Vector2(dataZoom.runtimeX, end);
1261  UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);
1262  UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);
1263  UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);
1264  break;
1265  }
1266  }
1267  }
1268 }
XCharts.DataZoom.supportInside
bool supportInside
Whether built-in support is supported. Built into the coordinate system to allow the user to zoom in ...
Definition: DataZoom.cs:150
XCharts.Orient
Orient
the layout is horizontal or vertical. 垂直还是水平布局方式。
Definition: BaseChart.cs:22
XCharts.DataZoom.left
float left
Distance between dataZoom component and the left side of the container. left value is a instant pixel...
Definition: DataZoom.cs:289
XCharts.DataZoom.scrollSensitivity
float scrollSensitivity
The sensitivity of dataZoom scroll. The larger the number, the more sensitive it is....
Definition: DataZoom.cs:350
XCharts.DataZoom.orient
Orient orient
Specify whether the layout of dataZoom component is horizontal or vertical. What's more,...
Definition: DataZoom.cs:362
XCharts.DataZoom.lineStyle
LineStyle lineStyle
阴影线条样式。
Definition: DataZoom.cs:379
XCharts.DataZoom.showDetail
bool showDetail
Whether to show detail, that is, show the detailed data information when dragging....
Definition: DataZoom.cs:203
XCharts.DataZoom.FilterMode
FilterMode
Generally dataZoom component zoom or roam coordinate system through data filtering and set the window...
Definition: DataZoom.cs:33
XCharts.DataZoom.fillerColor
Color32 fillerColor
the color of dataZoom data area. 数据区域颜色。
Definition: DataZoom.cs:238
XCharts.DataZoom
DataZoom component is used for zooming a specific area, which enables user to investigate data in det...
Definition: DataZoom.cs:24
XCharts.DataZoom.backgroundColor
Color backgroundColor
The background color of the component. 组件的背景颜色。
Definition: DataZoom.cs:229
XCharts.DataZoom.minShowNum
int minShowNum
Minimum number of display data. Minimum number of data displayed when DataZoom is enlarged to maximum...
Definition: DataZoom.cs:339
XCharts.DataZoom.IsInStartZoom
bool IsInStartZoom(Vector2 pos)
给定的坐标是否在开始活动条触发区域内
Definition: DataZoom.cs:527
XCharts.MainComponent
Definition: ChartComponent.cs:67
XCharts.DataZoom.start
float start
The start percentage of the window out of the data extent, in the range of 0 ~ 100....
Definition: DataZoom.cs:320
XCharts.DataZoom.xAxisIndexs
List< int > xAxisIndexs
Specify which xAxis is controlled by the dataZoom. 控制的 x 轴索引列表。
Definition: DataZoom.cs:129
XCharts.DataZoom.rangeMode
RangeMode rangeMode
Use absolute value or percent value in DataZoom.start and DataZoom.end. default:RangeMode....
Definition: DataZoom.cs:310
XCharts.TextStyle
Settings related to text. 文本的相关设置。
Definition: TextStyle.cs:21
XCharts.RoseType.None
@ None
Don't show as Nightingale chart.不展示成南丁格尔玫瑰图
XCharts.DataZoom.right
float right
Distance between dataZoom component and the right side of the container. right value is a instant pix...
Definition: DataZoom.cs:300
XCharts.DataZoom.IsInEndZoom
bool IsInEndZoom(Vector2 pos)
给定的坐标是否在结束活动条触发区域内
Definition: DataZoom.cs:548
XCharts.XAxis
The x axis in cartesian(rectangular) coordinate. a grid component can place at most 2 x axis,...
Definition: Axis.cs:960
XCharts.DataZoom.runtimeEndValue
double runtimeEndValue
运行时实际范围的结束值
Definition: DataZoom.cs:407
XCharts
Definition: RewardChart.cs:14
XCharts.DataZoom.showDataShadow
bool showDataShadow
Whether to show data shadow, to indicate the data tendency in brief. default:true 是否显示数据阴影。数据阴影可以简单地反...
Definition: DataZoom.cs:193
XCharts.DataZoom.supportInsideDrag
bool supportInsideDrag
是否支持坐标系内拖拽
Definition: DataZoom.cs:166
XCharts.DataZoom.supportInsideScroll
bool supportInsideScroll
是否支持坐标系内滚动
Definition: DataZoom.cs:158
XCharts.Axis
The axis in rectangular coordinate. 直角坐标系的坐标轴组件。
Definition: Axis.cs:20
XCharts.DataZoom.textStyle
TextStyle textStyle
font style. 文字格式。
Definition: DataZoom.cs:371
XCharts.DataZoom.IsInZoom
bool IsInZoom(Vector2 pos)
给定的坐标是否在缩放区域内
Definition: DataZoom.cs:473
XCharts.LineStyle
The style of line. 线条样式。 注: 修改 lineStyle 中的颜色不会影响图例颜色,如果需要图例颜色和折线图颜色一致,需修改 itemStyle....
Definition: LineStyle.cs:20
XCharts.DataZoom.areaStyle
AreaStyle areaStyle
阴影填充样式。
Definition: DataZoom.cs:387
XCharts.DataZoom.borderWidth
float borderWidth
边框宽。
Definition: DataZoom.cs:256
XCharts.DataZoom.runtimeStartValue
double runtimeStartValue
运行时实际范围的开始值
Definition: DataZoom.cs:403
XCharts.DataZoom.bottom
float bottom
Distance between dataZoom component and the bottom side of the container. bottom value is a instant p...
Definition: DataZoom.cs:267
XUGL
Definition: UGL.cs:12
XCharts.DataZoom.zoomLock
bool zoomLock
Specify whether to lock the size of window (selected area). default:false 是否锁定选择区域(或叫做数据窗口)的大小。 如果设置为...
Definition: DataZoom.cs:214
XCharts.DataZoom.RangeMode
RangeMode
The value type of start and end.取值类型
Definition: DataZoom.cs:64
XCharts.DataZoom.enable
bool enable
Whether to show dataZoom. 是否显示缩放区域。
Definition: DataZoom.cs:111
XCharts.DataZoom.borderColor
Color32 borderColor
the color of dataZoom border. 边框颜色。
Definition: DataZoom.cs:248
XCharts.DataZoom.yAxisIndexs
List< int > yAxisIndexs
Specify which yAxis is controlled by the dataZoom. 控制的 y 轴索引列表。
Definition: DataZoom.cs:138
XCharts.DataZoom.end
float end
The end percentage of the window out of the data extent, in the range of 0 ~ 100. default:70 数据窗口范围的结...
Definition: DataZoom.cs:330
XCharts.DataZoom.IsInSelectedZoom
bool IsInSelectedZoom(Vector2 pos)
给定的坐标是否在选中区域内
Definition: DataZoom.cs:488
XCharts.YAxis
The x axis in cartesian(rectangular) coordinate. a grid component can place at most 2 x axis,...
Definition: Axis.cs:996
XCharts.DataZoom.realtime
bool realtime
Whether to show data shadow in dataZoom-silder component, to indicate the data tendency in brief....
Definition: DataZoom.cs:223
XCharts.DataZoom.supportSlider
bool supportSlider
Whether a slider is supported. There are separate sliders on which the user zooms or roams....
Definition: DataZoom.cs:175
XCharts.DataZoom.top
float top
Distance between dataZoom component and the top side of the container. top value is a instant pixel v...
Definition: DataZoom.cs:278
XCharts.AreaStyle
The style of area. 区域填充样式。
Definition: AreaStyle.cs:18
XCharts.DataZoom.filterMode
FilterMode filterMode
The mode of data filter. 数据过滤类型。
Definition: DataZoom.cs:120