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)
{