From 8261e70e004023faa8a14d4a2bc471fea5f25947 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sun, 22 Aug 2021 09:26:14 +0800 Subject: [PATCH] Added serie's ignoreLineBreak parameter (#164) --- CHANGELOG-EN.md | 1 + CHANGELOG.md | 1 + Editor/PropertyDrawers/SerieDrawer.cs | 1 + Runtime/Component/Main/Serie.cs | 10 +++ Runtime/Internal/CoordinateChart_DrawLine.cs | 79 +++++++++++++------- 5 files changed, 64 insertions(+), 28 deletions(-) diff --git a/CHANGELOG-EN.md b/CHANGELOG-EN.md index f111fd4c..b305dbc5 100644 --- a/CHANGELOG-EN.md +++ b/CHANGELOG-EN.md @@ -39,6 +39,7 @@ ## master +* (2021.08.22) Added `Serie`'s `ignoreLineBreak` (#164) * (2021.08.22) Fixed `Axis` label may not be updated when `DataZoom` is turn on (#164) * (2021.08.15) Improved `Axis`'s `AxisLabel` text rotate setting to avoid inconsistency offset in `DataZoom` (#163) * (2021.08.14) Added `Legend`'s `textAutoColor` to set the text color match with `Serie` color (#163) diff --git a/CHANGELOG.md b/CHANGELOG.md index a632bdbb..e8bc5921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ ## master +* (2021.08.22) 增加`Serie`的`ignoreLineBreak`参数设置忽略数据连线是否断开 (#164) * (2021.08.22) 修复`Axis`在`DataZoom`开启时`Label`可能不更新的问题 (#164) * (2021.08.15) 优化`Axis`的`AxisLabel`文本旋转设置,避免在DataZoom开启时偏移不一致 (#163) * (2021.08.14) 增加`Legend`的`textAutoColor`设置文本颜色和`Serie`一致 (#163) diff --git a/Editor/PropertyDrawers/SerieDrawer.cs b/Editor/PropertyDrawers/SerieDrawer.cs index de3a5dd4..9b87a873 100644 --- a/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Editor/PropertyDrawers/SerieDrawer.cs @@ -68,6 +68,7 @@ namespace XCharts PropertyField(prop, "m_Clip"); PropertyField(prop, "m_Ignore"); PropertyField(prop, "m_IgnoreValue"); + PropertyField(prop, "m_IgnoreLineBreak"); PropertyField(prop, "m_ShowAsPositiveNumber"); PropertyField(prop, "m_Large"); PropertyField(prop, "m_LargeThreshold"); diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index dee5a7a3..bd149299 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -327,6 +327,7 @@ namespace XCharts [SerializeField] private bool m_Clip = false; [SerializeField] private bool m_Ignore = false; [SerializeField] private double m_IgnoreValue = 0; + [SerializeField] private bool m_IgnoreLineBreak = false; [SerializeField] private bool m_ShowAsPositiveNumber = false; [SerializeField] private bool m_Large = true; [SerializeField] private int m_LargeThreshold = 200; @@ -771,6 +772,15 @@ namespace XCharts set { if (PropertyUtil.SetStruct(ref m_IgnoreValue, value)) SetVerticesDirty(); } } /// + /// 忽略数据时折线是断开还是连接。默认false为连接。 + /// + /// + public bool ignoreLineBreak + { + get { return m_IgnoreLineBreak; } + set { if (PropertyUtil.SetStruct(ref m_IgnoreLineBreak, value)) SetVerticesDirty(); } + } + /// /// 雷达图类型。 /// public RadarType radarType diff --git a/Runtime/Internal/CoordinateChart_DrawLine.cs b/Runtime/Internal/CoordinateChart_DrawLine.cs index d9a3d6fc..d1ba9417 100644 --- a/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -167,8 +167,8 @@ namespace XCharts } var startIndex = 0; var endIndex = serie.dataPoints.Count; - var startPos = GetStartPos(serie.dataPoints, ref startIndex); - var endPos = GetEndPos(serie.dataPoints, ref endIndex); + var startPos = GetStartPos(serie.dataPoints, ref startIndex, serie.ignoreLineBreak); + var endPos = GetEndPos(serie.dataPoints, ref endIndex, serie.ignoreLineBreak); lp = startPos; stPos1 = stPos2 = lastDir = lastDnPos = Vector3.zero; smoothStartPosUp = smoothStartPosDn = Vector3.zero; @@ -219,10 +219,16 @@ namespace XCharts { np = serie.dataPoints[i]; serie.ClearSmoothList(i); + var isIgnoreBreak = false; if (np == Vector3.zero) { - serie.animation.SetDataFinish(i); - continue; + if (serie.ignoreLineBreak) + isIgnoreBreak = true; + else + { + serie.animation.SetDataFinish(i); + continue; + } } if (!serie.animation.NeedAnimation(i)) break; bool isFinish = true; @@ -239,34 +245,51 @@ namespace XCharts switch (serie.lineType) { case LineType.Normal: - lp = GetLastPos(serie.dataPoints, i, np); - nnp = GetNNPos(serie.dataPoints, i, np); - isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, - areaColor, areaToColor, zeroPos, startIndex); + lp = GetLastPos(serie.dataPoints, i, np, serie.ignoreLineBreak); + nnp = GetNNPos(serie.dataPoints, i, np, serie.ignoreLineBreak); + if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true; + isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i, + isIgnoreBreak ? ColorUtil.clearColor32 : lineColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor, + zeroPos, startIndex); break; case LineType.Smooth: case LineType.SmoothDash: - llp = GetLLPos(serie.dataPoints, i, firstLastPos); - nnp = GetNNPos(serie.dataPoints, i, lastNextPos); + llp = GetLLPos(serie.dataPoints, i, firstLastPos, serie.ignoreLineBreak); + nnp = GetNNPos(serie.dataPoints, i, lastNextPos, serie.ignoreLineBreak); + if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true; isFinish = DrawSmoothLine(vh, serie, xAxis, lp, np, llp, nnp, i, - lineColor, areaColor, areaToColor, isStack, zeroPos, startIndex); + isIgnoreBreak ? ColorUtil.clearColor32 : lineColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor, + isStack, zeroPos, startIndex); break; case LineType.StepStart: case LineType.StepMiddle: case LineType.StepEnd: - nnp = GetNNPos(serie.dataPoints, i, np); - isFinish = DrawStepLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, - areaColor, areaToColor, zeroPos); + nnp = GetNNPos(serie.dataPoints, i, np, serie.ignoreLineBreak); + if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true; + isFinish = DrawStepLine(vh, serie, xAxis, lp, np, nnp, i, + isIgnoreBreak ? ColorUtil.clearColor32 : lineColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor, + zeroPos); break; case LineType.Dash: case LineType.Dot: case LineType.DashDot: case LineType.DashDotDot: - DrawOtherLine(vh, serie, xAxis, lp, np, i, lineColor, areaColor, areaToColor, zeroPos); + if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true; + DrawOtherLine(vh, serie, xAxis, lp, np, i, + isIgnoreBreak ? ColorUtil.clearColor32 : lineColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaColor, + isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor, + zeroPos); break; } if (isFinish) serie.animation.SetDataFinish(i); - if (np != Vector3.zero) lp = np; + if (np != Vector3.zero || serie.ignoreLineBreak) lp = np; } if (!serie.animation.IsFinish()) { @@ -277,22 +300,22 @@ namespace XCharts } } - private Vector3 GetNNPos(List dataPoints, int index, Vector3 np) + private Vector3 GetNNPos(List dataPoints, int index, Vector3 np, bool ignoreLineBreak) { int size = dataPoints.Count; if (index >= size) return np; for (int i = index + 1; i < size; i++) { - if (dataPoints[i] != Vector3.zero) return dataPoints[i]; + if (dataPoints[i] != Vector3.zero || ignoreLineBreak) return dataPoints[i]; } return np; } - private Vector3 GetStartPos(List dataPoints, ref int start) + private Vector3 GetStartPos(List dataPoints, ref int start, bool ignoreLineBreak) { for (int i = 0; i < dataPoints.Count; i++) { - if (dataPoints[i] != Vector3.zero) + if (dataPoints[i] != Vector3.zero || ignoreLineBreak) { start = i; return dataPoints[i]; @@ -301,11 +324,11 @@ namespace XCharts return Vector3.zero; } - private Vector3 GetEndPos(List dataPoints, ref int end) + private Vector3 GetEndPos(List dataPoints, ref int end, bool ignoreLineBreak) { for (int i = dataPoints.Count - 1; i >= 0; i--) { - if (dataPoints[i] != Vector3.zero) + if (dataPoints[i] != Vector3.zero || ignoreLineBreak) { end = i; return dataPoints[i]; @@ -314,22 +337,22 @@ namespace XCharts return Vector3.zero; } - private Vector3 GetLastPos(List dataPoints, int index, Vector3 pos) + private Vector3 GetLastPos(List dataPoints, int index, Vector3 pos, bool ignoreLineBreak) { if (index <= 0) return pos; for (int i = index - 1; i >= 0; i--) { - if (dataPoints[i] != Vector3.zero) return dataPoints[i]; + if (dataPoints[i] != Vector3.zero || ignoreLineBreak) return dataPoints[i]; } return pos; } - private Vector3 GetLLPos(List dataPoints, int index, Vector3 lp) + private Vector3 GetLLPos(List dataPoints, int index, Vector3 lp, bool ignoreLineBreak) { if (index <= 1) return lp; for (int i = index - 2; i >= 0; i--) { - if (dataPoints[i] != Vector3.zero) return dataPoints[i]; + if (dataPoints[i] != Vector3.zero || ignoreLineBreak) return dataPoints[i]; } return lp; } @@ -941,8 +964,8 @@ namespace XCharts Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + grid.runtimeHeight) : new Vector3(zeroPos.x + grid.runtimeWidth, zeroPos.y); var sindex = 0; var eindex = 0; - var sp = GetStartPos(points, ref sindex); - var ep = GetEndPos(points, ref eindex); + var sp = GetStartPos(points, ref sindex, serie.ignoreLineBreak); + var ep = GetEndPos(points, ref eindex, serie.ignoreLineBreak); var cross = ChartHelper.GetIntersection(lp, np, zeroPos, aep); if (cross == Vector3.zero || smoothDownPoints.Count <= 3) {