Added serie's ignoreLineBreak parameter (#164)

This commit is contained in:
monitor1394
2021-08-22 09:26:14 +08:00
parent ceaa0d8649
commit 8261e70e00
5 changed files with 64 additions and 28 deletions

View File

@@ -39,6 +39,7 @@
## master ## 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.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.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) * (2021.08.14) Added `Legend`'s `textAutoColor` to set the text color match with `Serie` color (#163)

View File

@@ -39,6 +39,7 @@
## master ## master
* (2021.08.22) 增加`Serie``ignoreLineBreak`参数设置忽略数据连线是否断开 (#164)
* (2021.08.22) 修复`Axis``DataZoom`开启时`Label`可能不更新的问题 (#164) * (2021.08.22) 修复`Axis``DataZoom`开启时`Label`可能不更新的问题 (#164)
* (2021.08.15) 优化`Axis``AxisLabel`文本旋转设置避免在DataZoom开启时偏移不一致 (#163) * (2021.08.15) 优化`Axis``AxisLabel`文本旋转设置避免在DataZoom开启时偏移不一致 (#163)
* (2021.08.14) 增加`Legend``textAutoColor`设置文本颜色和`Serie`一致 (#163) * (2021.08.14) 增加`Legend``textAutoColor`设置文本颜色和`Serie`一致 (#163)

View File

@@ -68,6 +68,7 @@ namespace XCharts
PropertyField(prop, "m_Clip"); PropertyField(prop, "m_Clip");
PropertyField(prop, "m_Ignore"); PropertyField(prop, "m_Ignore");
PropertyField(prop, "m_IgnoreValue"); PropertyField(prop, "m_IgnoreValue");
PropertyField(prop, "m_IgnoreLineBreak");
PropertyField(prop, "m_ShowAsPositiveNumber"); PropertyField(prop, "m_ShowAsPositiveNumber");
PropertyField(prop, "m_Large"); PropertyField(prop, "m_Large");
PropertyField(prop, "m_LargeThreshold"); PropertyField(prop, "m_LargeThreshold");

View File

@@ -327,6 +327,7 @@ namespace XCharts
[SerializeField] private bool m_Clip = false; [SerializeField] private bool m_Clip = false;
[SerializeField] private bool m_Ignore = false; [SerializeField] private bool m_Ignore = false;
[SerializeField] private double m_IgnoreValue = 0; [SerializeField] private double m_IgnoreValue = 0;
[SerializeField] private bool m_IgnoreLineBreak = false;
[SerializeField] private bool m_ShowAsPositiveNumber = false; [SerializeField] private bool m_ShowAsPositiveNumber = false;
[SerializeField] private bool m_Large = true; [SerializeField] private bool m_Large = true;
[SerializeField] private int m_LargeThreshold = 200; [SerializeField] private int m_LargeThreshold = 200;
@@ -771,6 +772,15 @@ namespace XCharts
set { if (PropertyUtil.SetStruct(ref m_IgnoreValue, value)) SetVerticesDirty(); } set { if (PropertyUtil.SetStruct(ref m_IgnoreValue, value)) SetVerticesDirty(); }
} }
/// <summary> /// <summary>
/// 忽略数据时折线是断开还是连接。默认false为连接。
/// </summary>
/// <value></value>
public bool ignoreLineBreak
{
get { return m_IgnoreLineBreak; }
set { if (PropertyUtil.SetStruct(ref m_IgnoreLineBreak, value)) SetVerticesDirty(); }
}
/// <summary>
/// 雷达图类型。 /// 雷达图类型。
/// </summary> /// </summary>
public RadarType radarType public RadarType radarType

View File

@@ -167,8 +167,8 @@ namespace XCharts
} }
var startIndex = 0; var startIndex = 0;
var endIndex = serie.dataPoints.Count; var endIndex = serie.dataPoints.Count;
var startPos = GetStartPos(serie.dataPoints, ref startIndex); var startPos = GetStartPos(serie.dataPoints, ref startIndex, serie.ignoreLineBreak);
var endPos = GetEndPos(serie.dataPoints, ref endIndex); var endPos = GetEndPos(serie.dataPoints, ref endIndex, serie.ignoreLineBreak);
lp = startPos; lp = startPos;
stPos1 = stPos2 = lastDir = lastDnPos = Vector3.zero; stPos1 = stPos2 = lastDir = lastDnPos = Vector3.zero;
smoothStartPosUp = smoothStartPosDn = Vector3.zero; smoothStartPosUp = smoothStartPosDn = Vector3.zero;
@@ -219,10 +219,16 @@ namespace XCharts
{ {
np = serie.dataPoints[i]; np = serie.dataPoints[i];
serie.ClearSmoothList(i); serie.ClearSmoothList(i);
var isIgnoreBreak = false;
if (np == Vector3.zero) if (np == Vector3.zero)
{ {
serie.animation.SetDataFinish(i); if (serie.ignoreLineBreak)
continue; isIgnoreBreak = true;
else
{
serie.animation.SetDataFinish(i);
continue;
}
} }
if (!serie.animation.NeedAnimation(i)) break; if (!serie.animation.NeedAnimation(i)) break;
bool isFinish = true; bool isFinish = true;
@@ -239,34 +245,51 @@ namespace XCharts
switch (serie.lineType) switch (serie.lineType)
{ {
case LineType.Normal: case LineType.Normal:
lp = GetLastPos(serie.dataPoints, i, np); lp = GetLastPos(serie.dataPoints, i, np, serie.ignoreLineBreak);
nnp = GetNNPos(serie.dataPoints, i, np); nnp = GetNNPos(serie.dataPoints, i, np, serie.ignoreLineBreak);
isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true;
areaColor, areaToColor, zeroPos, startIndex); isFinish = DrawNormalLine(vh, serie, xAxis, lp, np, nnp, i,
isIgnoreBreak ? ColorUtil.clearColor32 : lineColor,
isIgnoreBreak ? ColorUtil.clearColor32 : areaColor,
isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor,
zeroPos, startIndex);
break; break;
case LineType.Smooth: case LineType.Smooth:
case LineType.SmoothDash: case LineType.SmoothDash:
llp = GetLLPos(serie.dataPoints, i, firstLastPos); llp = GetLLPos(serie.dataPoints, i, firstLastPos, serie.ignoreLineBreak);
nnp = GetNNPos(serie.dataPoints, i, lastNextPos); 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, 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; break;
case LineType.StepStart: case LineType.StepStart:
case LineType.StepMiddle: case LineType.StepMiddle:
case LineType.StepEnd: case LineType.StepEnd:
nnp = GetNNPos(serie.dataPoints, i, np); nnp = GetNNPos(serie.dataPoints, i, np, serie.ignoreLineBreak);
isFinish = DrawStepLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, if (lp == Vector3.zero && serie.ignoreLineBreak) isIgnoreBreak = true;
areaColor, areaToColor, zeroPos); isFinish = DrawStepLine(vh, serie, xAxis, lp, np, nnp, i,
isIgnoreBreak ? ColorUtil.clearColor32 : lineColor,
isIgnoreBreak ? ColorUtil.clearColor32 : areaColor,
isIgnoreBreak ? ColorUtil.clearColor32 : areaToColor,
zeroPos);
break; break;
case LineType.Dash: case LineType.Dash:
case LineType.Dot: case LineType.Dot:
case LineType.DashDot: case LineType.DashDot:
case LineType.DashDotDot: 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; break;
} }
if (isFinish) serie.animation.SetDataFinish(i); if (isFinish) serie.animation.SetDataFinish(i);
if (np != Vector3.zero) lp = np; if (np != Vector3.zero || serie.ignoreLineBreak) lp = np;
} }
if (!serie.animation.IsFinish()) if (!serie.animation.IsFinish())
{ {
@@ -277,22 +300,22 @@ namespace XCharts
} }
} }
private Vector3 GetNNPos(List<Vector3> dataPoints, int index, Vector3 np) private Vector3 GetNNPos(List<Vector3> dataPoints, int index, Vector3 np, bool ignoreLineBreak)
{ {
int size = dataPoints.Count; int size = dataPoints.Count;
if (index >= size) return np; if (index >= size) return np;
for (int i = index + 1; i < size; i++) 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; return np;
} }
private Vector3 GetStartPos(List<Vector3> dataPoints, ref int start) private Vector3 GetStartPos(List<Vector3> dataPoints, ref int start, bool ignoreLineBreak)
{ {
for (int i = 0; i < dataPoints.Count; i++) for (int i = 0; i < dataPoints.Count; i++)
{ {
if (dataPoints[i] != Vector3.zero) if (dataPoints[i] != Vector3.zero || ignoreLineBreak)
{ {
start = i; start = i;
return dataPoints[i]; return dataPoints[i];
@@ -301,11 +324,11 @@ namespace XCharts
return Vector3.zero; return Vector3.zero;
} }
private Vector3 GetEndPos(List<Vector3> dataPoints, ref int end) private Vector3 GetEndPos(List<Vector3> dataPoints, ref int end, bool ignoreLineBreak)
{ {
for (int i = dataPoints.Count - 1; i >= 0; i--) for (int i = dataPoints.Count - 1; i >= 0; i--)
{ {
if (dataPoints[i] != Vector3.zero) if (dataPoints[i] != Vector3.zero || ignoreLineBreak)
{ {
end = i; end = i;
return dataPoints[i]; return dataPoints[i];
@@ -314,22 +337,22 @@ namespace XCharts
return Vector3.zero; return Vector3.zero;
} }
private Vector3 GetLastPos(List<Vector3> dataPoints, int index, Vector3 pos) private Vector3 GetLastPos(List<Vector3> dataPoints, int index, Vector3 pos, bool ignoreLineBreak)
{ {
if (index <= 0) return pos; if (index <= 0) return pos;
for (int i = index - 1; i >= 0; i--) 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; return pos;
} }
private Vector3 GetLLPos(List<Vector3> dataPoints, int index, Vector3 lp) private Vector3 GetLLPos(List<Vector3> dataPoints, int index, Vector3 lp, bool ignoreLineBreak)
{ {
if (index <= 1) return lp; if (index <= 1) return lp;
for (int i = index - 2; i >= 0; i--) 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; 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); Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + grid.runtimeHeight) : new Vector3(zeroPos.x + grid.runtimeWidth, zeroPos.y);
var sindex = 0; var sindex = 0;
var eindex = 0; var eindex = 0;
var sp = GetStartPos(points, ref sindex); var sp = GetStartPos(points, ref sindex, serie.ignoreLineBreak);
var ep = GetEndPos(points, ref eindex); var ep = GetEndPos(points, ref eindex, serie.ignoreLineBreak);
var cross = ChartHelper.GetIntersection(lp, np, zeroPos, aep); var cross = ChartHelper.GetIntersection(lp, np, zeroPos, aep);
if (cross == Vector3.zero || smoothDownPoints.Count <= 3) if (cross == Vector3.zero || smoothDownPoints.Count <= 3)
{ {