From e2c45bb001558de4e0b210404a310de45d63c935 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Thu, 13 Aug 2020 09:05:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`BarChart`=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8F=98=E6=9B=B4=E5=8A=A8=E7=94=BB#83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/API/RingChart_API.cs | 5 ++- Runtime/Component/Main/Serie.cs | 5 ++- Runtime/Component/Sub/SerieData.cs | 38 +++++++++++++++++-- Runtime/Internal/CoordinateChart.cs | 2 +- Runtime/Internal/CoordinateChart_DrawBar.cs | 4 +- .../Internal/CoordinateChart_DrawHeatmap.cs | 2 +- Runtime/Internal/CoordinateChart_DrawLine.cs | 29 +++++++------- 7 files changed, 60 insertions(+), 25 deletions(-) diff --git a/Runtime/API/RingChart_API.cs b/Runtime/API/RingChart_API.cs index 1bc54637..15786f36 100644 --- a/Runtime/API/RingChart_API.cs +++ b/Runtime/API/RingChart_API.cs @@ -27,7 +27,7 @@ namespace XCharts var serieData = serie.GetSerieData(dataIndex); if (serieData != null) { - return serieData.UpdateData(1, value); + return serieData.UpdateData(1, value, serie.animation.GetUpdateAnimationDuration()); } } return false; @@ -47,7 +47,8 @@ namespace XCharts var flag = true; foreach (var serieData in serie.data) { - if (!serieData.UpdateData(1, value)) flag = false; + if (!serieData.UpdateData(1, value, serie.animation.GetUpdateAnimationDuration())) + flag = false; } return flag; } diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 240d74b9..08264212 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -1095,6 +1095,7 @@ namespace XCharts { if (sdata.show) total += sdata.GetCurrData(1, animation.GetUpdateAnimationDuration()); + //total += sdata.GetData(1); } return total; } @@ -1503,7 +1504,7 @@ namespace XCharts { if (index >= 0 && index < m_Data.Count) { - var flag = m_Data[index].UpdateData(dimension, value); + var flag = m_Data[index].UpdateData(dimension, value, animation.GetUpdateAnimationDuration()); if (flag) SetVerticesDirty(); return flag; } @@ -1524,7 +1525,7 @@ namespace XCharts { var serieData = m_Data[index]; for (int i = 0; i < values.Count; i++) - serieData.UpdateData(i, values[i]); + serieData.UpdateData(i, values[i], animation.GetUpdateAnimationDuration()); SetVerticesDirty(); return true; } diff --git a/Runtime/Component/Sub/SerieData.cs b/Runtime/Component/Sub/SerieData.cs index 52f90eaa..bfb93851 100644 --- a/Runtime/Component/Sub/SerieData.cs +++ b/Runtime/Component/Sub/SerieData.cs @@ -228,15 +228,44 @@ namespace XCharts } public float GetCurrData(int index, float animationDuration = 500f, bool inverse = false) + { + return GetCurrData(index, animationDuration, inverse, 0, 0); + } + + public float GetCurrData(int index, float animationDuration, bool inverse, float min, float max) { if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0) { var time = Time.time - m_DataUpdateTime[index]; var total = animationDuration / 1000; - if (time <= total) + + var rate = time / total; + if (rate > 1) rate = 1; + if (rate < 1) { CheckLastData(); - var curr = Mathf.Lerp(GetPreviousData(index, inverse), GetData(index, inverse), time / total); + var curr = Mathf.Lerp(GetPreviousData(index), GetData(index), rate); + if (min != 0 || max != 0) + { + if (inverse) + { + var temp = min; + min = -max; + max = -temp; + } + var pre = m_PreviousData[index]; + if (pre < min) + { + m_PreviousData[index] = min; + curr = min; + } + else if (pre > max) + { + m_PreviousData[index] = max; + curr = max; + } + } + curr = inverse ? -curr : curr; return curr; } else @@ -251,12 +280,13 @@ namespace XCharts } } - public bool UpdateData(int dimension, float value) + public bool UpdateData(int dimension, float value, float animationDuration = 500f) { if (dimension >= 0 && dimension < data.Count) { CheckLastData(); - m_PreviousData[dimension] = data[dimension]; + m_PreviousData[dimension] = GetCurrData(dimension, animationDuration); + //m_PreviousData[dimension] = data[dimension];; m_DataUpdateTime[dimension] = Time.time; m_DataUpdateFlag[dimension] = true; data[dimension] = value; diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index f3db108f..8c1cb19a 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -1173,7 +1173,7 @@ namespace XCharts for (int i = 0; i < maxCount; i += rate) { float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, - serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis.inverse); + serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis); float pX = m_CoordinateX + i * scaleWid; float dataHig = (maxValue - minValue) == 0 ? 0 : (value - minValue) / (maxValue - minValue) * hig; diff --git a/Runtime/Internal/CoordinateChart_DrawBar.cs b/Runtime/Internal/CoordinateChart_DrawBar.cs index e0135a2c..dfbfb175 100644 --- a/Runtime/Internal/CoordinateChart_DrawBar.cs +++ b/Runtime/Internal/CoordinateChart_DrawBar.cs @@ -67,7 +67,7 @@ namespace XCharts var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight); serieData.canShowLabel = true; - float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse); + float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse, xMinValue, xMaxValue); float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth; if (showData[i].IsDataChanged()) dataChanging = true; float axisLineWidth = (value < 0 ? -1 : 1) * yAxis.axisLine.width; @@ -205,7 +205,7 @@ namespace XCharts || serie.data[i].highlighted || serie.highlighted; var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight); - float value = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse); + float value = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth; if (serieData.IsDataChanged()) dataChanging = true; float pX = m_CoordinateX + i * categoryWidth; diff --git a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs index ea5fe96c..0007643e 100644 --- a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs +++ b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs @@ -151,7 +151,7 @@ namespace XCharts serie.dataPoints.Add(Vector3.zero); continue; } - var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse); + var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse, yAxis.runtimeMinValue, yAxis.runtimeMaxValue); if (serieData.IsDataChanged()) dataChanging = true; var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth); serie.dataPoints.Add(pos); diff --git a/Runtime/Internal/CoordinateChart_DrawLine.cs b/Runtime/Internal/CoordinateChart_DrawLine.cs index b29a41ed..a5447af0 100644 --- a/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -143,7 +143,7 @@ namespace XCharts else { float yValue = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, - i, dataChangeDuration, ref dataChanging, yAxis.inverse); + i, dataChangeDuration, ref dataChanging, yAxis); seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np, dataChangeDuration); serie.dataPoints.Add(np); @@ -163,7 +163,7 @@ namespace XCharts } else { - float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse); + float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse, yAxis.runtimeMinValue, yAxis.runtimeMaxValue); seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np, dataChangeDuration); serie.dataPoints.Add(np); @@ -195,7 +195,7 @@ namespace XCharts } else { - float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse); + float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse, yAxis.runtimeMinValue, yAxis.runtimeMaxValue); GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref firstLastPos, dataChangeDuration); } } @@ -212,7 +212,7 @@ namespace XCharts } else { - float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse); + float yValue = showData[i].GetCurrData(1, dataChangeDuration, yAxis.inverse, yAxis.runtimeMinValue, yAxis.runtimeMaxValue); GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref lastNextPos, dataChangeDuration); } } @@ -357,12 +357,15 @@ namespace XCharts private float SampleValue(ref List showData, SampleType sampleType, int rate, int minCount, int maxCount, float totalAverage, int index, float dataChangeDuration, - ref bool dataChanging, bool inverse) + ref bool dataChanging, Axis axis) { + var inverse = axis.inverse; + var minValue = axis.runtimeMinValue; + var MaxValue = axis.runtimeMaxValue; if (rate <= 1 || index == minCount) { if (showData[index].IsDataChanged()) dataChanging = true; - return showData[index].GetCurrData(1, dataChangeDuration, inverse); + return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); } switch (sampleType) { @@ -371,7 +374,7 @@ namespace XCharts float total = 0; for (int i = index; i > index - rate; i--) { - total += showData[i].GetCurrData(1, dataChangeDuration, inverse); + total += showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); if (showData[i].IsDataChanged()) dataChanging = true; } if (sampleType == SampleType.Average) return total / rate; @@ -380,7 +383,7 @@ namespace XCharts float max = float.MinValue; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); if (value > max) max = value; if (showData[i].IsDataChanged()) dataChanging = true; } @@ -389,7 +392,7 @@ namespace XCharts float min = float.MaxValue; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); if (value < min) min = value; if (showData[i].IsDataChanged()) dataChanging = true; } @@ -400,7 +403,7 @@ namespace XCharts total = 0; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); total += value; if (value < min) min = value; if (value > max) max = value; @@ -411,7 +414,7 @@ namespace XCharts else return min; } if (showData[index].IsDataChanged()) dataChanging = true; - return showData[index].GetCurrData(1, dataChangeDuration, inverse); + return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue); } private float GetDataPoint(Axis xAxis, Axis yAxis, List showData, float yValue, float startX, int i, @@ -523,7 +526,7 @@ namespace XCharts { for (int j = 0; j < rate; j++) seriesHig.Add(0); } - float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse); + float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse, xAxis.runtimeMinValue, xAxis.runtimeMaxValue); float pY = startY + i * scaleWid; float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float dataHig = 0; @@ -550,7 +553,7 @@ namespace XCharts { i = maxCount - 1; seriesHig.Add(0); - float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse); + float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse, xAxis.runtimeMinValue, xAxis.runtimeMaxValue); float pY = startY + i * scaleWid; float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float dataHig = 0;