优化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);
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;
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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<SerieData> 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<SerieData> 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;