优化BarChart的数据变更动画#83

This commit is contained in:
monitor1394
2020-08-13 09:05:21 +08:00
parent c335140eff
commit e2c45bb001
7 changed files with 60 additions and 25 deletions

View File

@@ -27,7 +27,7 @@ namespace XCharts
var serieData = serie.GetSerieData(dataIndex); var serieData = serie.GetSerieData(dataIndex);
if (serieData != null) if (serieData != null)
{ {
return serieData.UpdateData(1, value); return serieData.UpdateData(1, value, serie.animation.GetUpdateAnimationDuration());
} }
} }
return false; return false;
@@ -47,7 +47,8 @@ namespace XCharts
var flag = true; var flag = true;
foreach (var serieData in serie.data) 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; return flag;
} }

View File

@@ -1095,6 +1095,7 @@ namespace XCharts
{ {
if (sdata.show) if (sdata.show)
total += sdata.GetCurrData(1, animation.GetUpdateAnimationDuration()); total += sdata.GetCurrData(1, animation.GetUpdateAnimationDuration());
//total += sdata.GetData(1);
} }
return total; return total;
} }
@@ -1503,7 +1504,7 @@ namespace XCharts
{ {
if (index >= 0 && index < m_Data.Count) 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(); if (flag) SetVerticesDirty();
return flag; return flag;
} }
@@ -1524,7 +1525,7 @@ namespace XCharts
{ {
var serieData = m_Data[index]; var serieData = m_Data[index];
for (int i = 0; i < values.Count; i++) for (int i = 0; i < values.Count; i++)
serieData.UpdateData(i, values[i]); serieData.UpdateData(i, values[i], animation.GetUpdateAnimationDuration());
SetVerticesDirty(); SetVerticesDirty();
return true; return true;
} }

View File

@@ -228,15 +228,44 @@ namespace XCharts
} }
public float GetCurrData(int index, float animationDuration = 500f, bool inverse = false) 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) if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0)
{ {
var time = Time.time - m_DataUpdateTime[index]; var time = Time.time - m_DataUpdateTime[index];
var total = animationDuration / 1000; var total = animationDuration / 1000;
if (time <= total)
var rate = time / total;
if (rate > 1) rate = 1;
if (rate < 1)
{ {
CheckLastData(); 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; return curr;
} }
else 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) if (dimension >= 0 && dimension < data.Count)
{ {
CheckLastData(); CheckLastData();
m_PreviousData[dimension] = data[dimension]; m_PreviousData[dimension] = GetCurrData(dimension, animationDuration);
//m_PreviousData[dimension] = data[dimension];;
m_DataUpdateTime[dimension] = Time.time; m_DataUpdateTime[dimension] = Time.time;
m_DataUpdateFlag[dimension] = true; m_DataUpdateFlag[dimension] = true;
data[dimension] = value; data[dimension] = value;

View File

@@ -1173,7 +1173,7 @@ namespace XCharts
for (int i = 0; i < maxCount; i += rate) for (int i = 0; i < maxCount; i += rate)
{ {
float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, 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 pX = m_CoordinateX + i * scaleWid;
float dataHig = (maxValue - minValue) == 0 ? 0 : float dataHig = (maxValue - minValue) == 0 ? 0 :
(value - minValue) / (maxValue - minValue) * hig; (value - minValue) / (maxValue - minValue) * hig;

View File

@@ -67,7 +67,7 @@ namespace XCharts
var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight); var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight);
serieData.canShowLabel = true; 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; float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth;
if (showData[i].IsDataChanged()) dataChanging = true; if (showData[i].IsDataChanged()) dataChanging = true;
float axisLineWidth = (value < 0 ? -1 : 1) * yAxis.axisLine.width; float axisLineWidth = (value < 0 ? -1 : 1) * yAxis.axisLine.width;
@@ -205,7 +205,7 @@ namespace XCharts
|| serie.data[i].highlighted || serie.data[i].highlighted
|| serie.highlighted; || serie.highlighted;
var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight); 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; float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth;
if (serieData.IsDataChanged()) dataChanging = true; if (serieData.IsDataChanged()) dataChanging = true;
float pX = m_CoordinateX + i * categoryWidth; float pX = m_CoordinateX + i * categoryWidth;

View File

@@ -151,7 +151,7 @@ namespace XCharts
serie.dataPoints.Add(Vector3.zero); serie.dataPoints.Add(Vector3.zero);
continue; 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; if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth); var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth);
serie.dataPoints.Add(pos); serie.dataPoints.Add(pos);

View File

@@ -143,7 +143,7 @@ namespace XCharts
else else
{ {
float yValue = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, 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, seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
dataChangeDuration); dataChangeDuration);
serie.dataPoints.Add(np); serie.dataPoints.Add(np);
@@ -163,7 +163,7 @@ namespace XCharts
} }
else 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, seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
dataChangeDuration); dataChangeDuration);
serie.dataPoints.Add(np); serie.dataPoints.Add(np);
@@ -195,7 +195,7 @@ namespace XCharts
} }
else 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); GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref firstLastPos, dataChangeDuration);
} }
} }
@@ -212,7 +212,7 @@ namespace XCharts
} }
else 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); GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref lastNextPos, dataChangeDuration);
} }
} }
@@ -357,12 +357,15 @@ namespace XCharts
private float SampleValue(ref List<SerieData> showData, SampleType sampleType, int rate, private float SampleValue(ref List<SerieData> showData, SampleType sampleType, int rate,
int minCount, int maxCount, float totalAverage, int index, float dataChangeDuration, 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 (rate <= 1 || index == minCount)
{ {
if (showData[index].IsDataChanged()) dataChanging = true; if (showData[index].IsDataChanged()) dataChanging = true;
return showData[index].GetCurrData(1, dataChangeDuration, inverse); return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, MaxValue);
} }
switch (sampleType) switch (sampleType)
{ {
@@ -371,7 +374,7 @@ namespace XCharts
float total = 0; float total = 0;
for (int i = index; i > index - rate; i--) 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 (showData[i].IsDataChanged()) dataChanging = true;
} }
if (sampleType == SampleType.Average) return total / rate; if (sampleType == SampleType.Average) return total / rate;
@@ -380,7 +383,7 @@ namespace XCharts
float max = float.MinValue; float max = float.MinValue;
for (int i = index; i > index - rate; i--) 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 (value > max) max = value;
if (showData[i].IsDataChanged()) dataChanging = true; if (showData[i].IsDataChanged()) dataChanging = true;
} }
@@ -389,7 +392,7 @@ namespace XCharts
float min = float.MaxValue; float min = float.MaxValue;
for (int i = index; i > index - rate; i--) 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 (value < min) min = value;
if (showData[i].IsDataChanged()) dataChanging = true; if (showData[i].IsDataChanged()) dataChanging = true;
} }
@@ -400,7 +403,7 @@ namespace XCharts
total = 0; total = 0;
for (int i = index; i > index - rate; i--) 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; total += value;
if (value < min) min = value; if (value < min) min = value;
if (value > max) max = value; if (value > max) max = value;
@@ -411,7 +414,7 @@ namespace XCharts
else return min; else return min;
} }
if (showData[index].IsDataChanged()) dataChanging = true; 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<SerieData> showData, float yValue, float startX, int i, private float GetDataPoint(Axis xAxis, Axis yAxis, List<SerieData> showData, float yValue, float startX, int i,
@@ -523,7 +526,7 @@ namespace XCharts
{ {
for (int j = 0; j < rate; j++) seriesHig.Add(0); 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 pY = startY + i * scaleWid;
float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width;
float dataHig = 0; float dataHig = 0;
@@ -550,7 +553,7 @@ namespace XCharts
{ {
i = maxCount - 1; i = maxCount - 1;
seriesHig.Add(0); 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 pY = startY + i * scaleWid;
float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width;
float dataHig = 0; float dataHig = 0;