优化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

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