增加数据更新动画

This commit is contained in:
monitor1394
2019-12-03 07:49:37 +08:00
parent ab057cb623
commit 74b304a72d
15 changed files with 263 additions and 50 deletions

View File

@@ -1,6 +1,7 @@
# 更新日志
* (2019.12.03) 增加数据更新动画
* (2019.11.30) 增加`GaugeChart`仪表盘
* (2019.11.22) 修复`BarChart`清空数据重新赋值后`SerieLabel`显示异常的问题
* (2019.11.16) 修复`SerieLabel`设置`color`等参数不生效的问题

View File

@@ -0,0 +1,52 @@
/******************************************/
/* */
/* Copyright (c) 2018 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/******************************************/
using UnityEngine;
namespace XCharts
{
[DisallowMultipleComponent]
[ExecuteInEditMode]
public class Demo01_UpdateData : MonoBehaviour
{
private float updateTime = 0;
BaseChart chart;
void Awake()
{
chart = gameObject.GetComponent<BaseChart>();
}
void Update()
{
updateTime += Time.deltaTime;
if (chart && updateTime > 2)
{
updateTime = 0;
var serie = chart.series.GetSerie(0);
//serie.animation.updateAnimation = true;
var dataCount = serie.dataCount;
if (chart is RadarChart)
{
var dimension = serie.GetSerieData(0).data.Count - 1;
chart.UpdateData(0, 0, Random.Range(0, dimension + 1), Random.Range(0, 100));
}
else if (chart is HeatmapChart)
{
var dimension = serie.GetSerieData(0).data.Count - 1;
for (int i = 0; i < dataCount; i++)
{
chart.UpdateData(0, i, dimension, Random.Range(0, 10));
}
}
else
{
chart.UpdateData(0, Random.Range(0, dataCount), Random.Range(10, 90));
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e6faaaf3d4a8444b4b2736825e237fcf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -15,23 +15,33 @@ namespace XCharts
public class Demo_Test : MonoBehaviour
{
private float updateTime = 0;
CoordinateChart chart;
BaseChart chart;
void Awake()
{
chart = gameObject.GetComponent<CoordinateChart>();
if (chart == null)
{
chart = gameObject.AddComponent<CoordinateChart>();
}
chart = gameObject.GetComponent<BaseChart>();
}
void Update()
{
updateTime += Time.deltaTime;
if (updateTime > 2)
if (chart && updateTime > 2)
{
updateTime = 0;
chart.UpdateData(0, Random.Range(0, 5), Random.Range(10, 90));
var serie = chart.series.GetSerie(0);
serie.animation.updateAnimation = true;
var dataCount = serie.dataCount;
if (chart is HeatmapChart)
{
var dimension = serie.GetSerieData(0).data.Count - 1;
for (int i = 0; i < dataCount; i++)
{
chart.UpdateData(0, i, dimension, Random.Range(0, 10));
}
}
else
{
chart.UpdateData(0, Random.Range(0, dataCount), Random.Range(10, 90));
}
}
}
}

View File

@@ -277,6 +277,32 @@ namespace XCharts
RefreshChart();
}
/// <summary>
/// 更新指定系列指定索引指定维数的数据。维数从0开始。
/// </summary>
/// <param name="serieName"></param>
/// <param name="dataIndex"></param>
/// <param name="dimension">指定维数从0开始</param>
/// <param name="value"></param>
public virtual void UpdateData(string serieName, int dataIndex, int dimension, float value)
{
m_Series.UpdateData(serieName, dataIndex, dimension, value);
RefreshChart();
}
/// <summary>
/// 更新指定系列指定索引指定维数的数据。维数从0开始。
/// </summary>
/// <param name="serieIndex"></param>
/// <param name="dataIndex"></param>
/// <param name="dimension">指定维数从0开始</param>
/// <param name="value"></param>
public virtual void UpdateData(int serieIndex, int dataIndex, int dimension, float value)
{
m_Series.UpdateData(serieIndex, dataIndex, dimension, value);
RefreshChart();
}
/// <summary>
/// Update serie data name.
/// 更新指定系列中的指定索引数据名称。
@@ -419,7 +445,7 @@ namespace XCharts
OnThemeChanged();
RefreshChart();
}
/// <summary>
/// Update chart theme info.
/// 切换图表主题。

View File

@@ -668,7 +668,7 @@ namespace XCharts
foreach (var sdata in data)
{
if (sdata.show)
total += sdata.data[1];
total += sdata.GetCurrData(1, animation.GetUpdateAnimationDuration());
}
return total;
}
@@ -724,9 +724,15 @@ namespace XCharts
}
}
int xValue = m_Data.Count;
var serieData = new SerieData() { data = new List<float>() { xValue, value }, name = dataName };
var serieData = new SerieData()
{
data = new List<float>() { xValue, value },
lastData = new List<float>() { xValue, value },
name = dataName
};
serieData.index = xValue;
m_Data.Add(serieData);
m_ShowDataDimension = 1;
return serieData;
}
@@ -747,9 +753,15 @@ namespace XCharts
m_Data.RemoveAt(0);
}
}
var serieData = new SerieData() { data = new List<float>() { xValue, yValue }, name = dataName };
var serieData = new SerieData()
{
data = new List<float>() { xValue, yValue },
lastData = new List<float>() { xValue, yValue },
name = dataName
};
serieData.index = m_Data.Count;
m_Data.Add(serieData);
m_ShowDataDimension = 2;
return serieData;
}
@@ -781,12 +793,14 @@ namespace XCharts
m_Data.RemoveAt(0);
}
}
m_ShowDataDimension = valueList.Count;
var serieData = new SerieData();
serieData.name = dataName;
serieData.index = m_Data.Count;
for (int i = 0; i < valueList.Count; i++)
{
serieData.data.Add(valueList[i]);
serieData.lastData.Add(valueList[i]);
}
m_Data.Add(serieData);
return serieData;

View File

@@ -448,6 +448,38 @@ namespace XCharts
}
}
/// <summary>
/// 更新指定系列指定数据项指定维度的数据值
/// </summary>
/// <param name="serieIndex">系列</param>
/// <param name="dataIndex">数据项</param>
/// <param name="dimension">数据维数从0开始</param>
/// <param name="value">值</param>
public void UpdateData(int serieIndex, int dataIndex, int dimension, float value)
{
var serie = GetSerie(serieIndex);
if (serie != null)
{
serie.UpdateData(dataIndex, dimension, value);
}
}
/// <summary>
/// 更新指定系列指定数据项指定维度的数据值
/// </summary>
/// <param name="serieName"></param>
/// <param name="dataIndex"></param>
/// <param name="dimension">数据维数从0开始</param>
/// <param name="value"></param>
public void UpdateData(string serieName, int dataIndex, int dimension, float value)
{
var serie = GetSerie(serieName);
if (serie != null)
{
serie.UpdateData(dataIndex, dimension, value);
}
}
/// <summary>
/// 更新指定系列的维度X和维度Y数据

View File

@@ -158,7 +158,7 @@ namespace XCharts
#if UNITY_EDITOR
if (!Application.isPlaying) return true;
#endif
return !enable || (m_CurrDataProgress > m_DestDataProgress && m_CurrDetailProgress > m_DestDetailProgress);
return !enable || m_IsEnd || (m_CurrDataProgress > m_DestDataProgress && m_CurrDetailProgress > m_DestDetailProgress);
}
public bool IsInDelay()

View File

@@ -153,9 +153,10 @@ namespace XCharts
public float runtimePieOffsetRadius { get; internal set; }
public Vector3 runtiemPieOffsetCenter { get; internal set; }
private bool m_DataChanged;
private float m_LastData;
private float m_DataUpdateTime;
private List<float> m_LastData = new List<float>();
private List<float> m_DataUpdateTime = new List<float>();
private List<bool> m_DataUpdateFlag = new List<bool>();
public List<float> lastData { get { return m_LastData; } internal set { m_LastData = value; } }
public float GetData(int index)
{
@@ -166,20 +167,30 @@ namespace XCharts
else return 0;
}
public float GetLastData(int index)
{
if (index >= 0 && index < lastData.Count)
{
return m_LastData[index];
}
else return 0;
}
public float GetCurrData(int index, float animationDuration = 500f)
{
if (index == 1 && m_DataChanged)
if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0)
{
var time = Time.time - m_DataUpdateTime;
var time = Time.time - m_DataUpdateTime[index];
var total = animationDuration / 1000;
if (animationDuration > 0 && time <= total)
if (time <= total)
{
var curr = Mathf.Lerp(m_LastData, GetData(index), time / total);
CheckLastData();
var curr = Mathf.Lerp(GetLastData(index), GetData(index), time / total);
return curr;
}
else
{
m_DataChanged = false;
m_DataUpdateFlag[index] = false;
return GetData(index);
}
}
@@ -189,29 +200,37 @@ namespace XCharts
}
}
public float GetLastData(int index)
{
if (index == 1 && m_DataChanged) return m_LastData;
else return GetData(index);
}
public void UpdateData(int dimension, float value)
{
if (dimension >= 0 && dimension < data.Count)
{
if (dimension == 1)
{
m_LastData = data[dimension];
m_DataUpdateTime = Time.time;
m_DataChanged = true;
}
CheckLastData();
m_LastData[dimension] = data[dimension];
m_DataUpdateTime[dimension] = Time.time;
m_DataUpdateFlag[dimension] = true;
data[dimension] = value;
}
}
private void CheckLastData()
{
if (m_LastData.Count != m_Data.Count)
{
m_LastData.Clear();
for (int i = 0; i < m_Data.Count; i++)
{
m_LastData.Add(m_Data[i]);
m_DataUpdateTime.Add(Time.time);
m_DataUpdateFlag.Add(false);
}
}
}
public bool IsDataChanged()
{
return m_DataChanged;
foreach (var b in m_DataUpdateFlag)
if (b) return true;
return false;
}
public void InitLabel(GameObject labelObj, bool autoSize, float paddingLeftRight, float paddingTopBottom)

View File

@@ -43,6 +43,10 @@ namespace XCharts
}
}
var isPercentStack = m_Series.IsPercentStack(serie.stack, SerieType.Bar);
bool dataChanging = false;
float updateDuration = serie.animation.GetUpdateAnimationDuration();
float xMinValue = xAxis.GetCurrMinValue(updateDuration);
float xMaxValue = xAxis.GetCurrMaxValue(updateDuration);
for (int i = serie.minShow; i < maxCount; i++)
{
if (i >= seriesHig.Count)
@@ -51,7 +55,8 @@ namespace XCharts
}
var serieData = showData[i];
serieData.canShowLabel = true;
float value = showData[i].data[1];
float value = showData[i].GetCurrData(1, updateDuration);
if (showData[i].IsDataChanged()) dataChanging = true;
float pX = seriesHig[i] + coordinateX + xAxis.runtimeZeroXOffset + yAxis.axisLine.width;
float pY = coordinateY + +i * categoryWidth;
if (!yAxis.boundaryGap) pY -= categoryWidth / 2;
@@ -66,9 +71,9 @@ namespace XCharts
}
else
{
valueTotal = xAxis.runtimeMaxValue - xAxis.runtimeMinValue;
valueTotal = xMaxValue - xMinValue;
if (valueTotal != 0)
barHig = (xAxis.runtimeMinValue > 0 ? value - xAxis.runtimeMinValue : value)
barHig = (xMinValue > 0 ? value - xMinValue : value)
/ valueTotal * coordinateWidth;
seriesHig[i] += barHig;
}
@@ -103,6 +108,10 @@ namespace XCharts
{
m_BarLastOffset += barGapWidth;
}
if (dataChanging)
{
RefreshChart();
}
}
private float CheckAnimation(Serie serie, int dataIndex, float barHig)
@@ -156,8 +165,10 @@ namespace XCharts
}
var isPercentStack = m_Series.IsPercentStack(serie.stack, SerieType.Bar);
float updateDuration = serie.animation.GetUpdateAnimationDuration();
bool dataChanging = false;
float updateDuration = serie.animation.GetUpdateAnimationDuration();
float yMinValue = yAxis.GetCurrMinValue(updateDuration);
float yMaxValue = yAxis.GetCurrMaxValue(updateDuration);
for (int i = serie.minShow; i < maxCount; i++)
{
if (i >= seriesHig.Count)
@@ -181,9 +192,9 @@ namespace XCharts
}
else
{
valueTotal = yAxis.runtimeMaxValue - yAxis.runtimeMinValue;
valueTotal = yMaxValue - yMinValue;
if (valueTotal != 0)
barHig = (yAxis.runtimeMinValue > 0 ? value - yAxis.runtimeMinValue : value)
barHig = (yMinValue > 0 ? value - yMinValue : value)
/ valueTotal * coordinateHeight;
seriesHig[i] += barHig;
}

View File

@@ -135,6 +135,8 @@ namespace XCharts
serie.dataPoints.Clear();
serie.animation.InitProgress(1, 0, xCount);
var animationIndex = serie.animation.GetCurrIndex();
var updateDuration = serie.animation.GetUpdateAnimationDuration();
var dataChanging = false;
for (int i = 0; i < xCount; i++)
{
for (int j = 0; j < yCount; j++)
@@ -144,7 +146,8 @@ namespace XCharts
var serieData = dataList[dataIndex];
var dimension = m_VisualMap.enable && m_VisualMap.dimension > 0 ? m_VisualMap.dimension - 1 :
serieData.data.Count - 1;
var value = serieData.data[dimension];
var value = serieData.GetCurrData(dimension, updateDuration);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth);
serie.dataPoints.Add(pos);
serieData.canShowLabel = false;
@@ -159,7 +162,7 @@ namespace XCharts
if (!m_VisualMap.IsInSelectedValue(value)) continue;
color = m_VisualMap.GetColor(value);
}
if(animationIndex>= 0 && i> animationIndex) continue;
if (animationIndex >= 0 && i > animationIndex) continue;
serieData.canShowLabel = true;
var emphasis = (m_Tooltip.show && i == (int)m_Tooltip.runtimeXValues[0] && j == (int)m_Tooltip.runtimeYValues[0])
|| m_VisualMap.runtimeSelectedIndex > 0;
@@ -186,6 +189,10 @@ namespace XCharts
m_IsPlayingStartAnimation = true;
RefreshChart();
}
if (dataChanging)
{
RefreshChart();
}
}
protected void DrawVisualMap(VertexHelper vh)

View File

@@ -368,28 +368,37 @@ namespace XCharts
var sampleDist = serie.sampleDist;
if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (coordinateWidth / sampleDist));
if (rate < 1) rate = 1;
var dataChanging = false;
float updateDuration = serie.animation.GetUpdateAnimationDuration();
float xMinValue = xAxis.GetCurrMinValue(updateDuration);
float xMaxValue = xAxis.GetCurrMaxValue(updateDuration);
for (i = serie.minShow; i < maxCount; i += rate)
{
if (i >= seriesHig.Count)
{
for (int j = 0; j < rate; j++) seriesHig.Add(0);
}
float value = showData[i].data[1];
float value = showData[i].GetCurrData(1, updateDuration);
float pY = startY + i * scaleWid;
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
float dataHig = (value - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
float dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth;
np = new Vector3(pX + dataHig, pY);
serie.dataPoints.Add(np);
seriesHig[i] += dataHig;
if (showData[i].IsDataChanged()) dataChanging = true;
}
if (dataChanging)
{
RefreshChart();
}
if (maxCount % rate != 0)
{
i = maxCount - 1;
seriesHig.Add(0);
float value = showData[i].data[1];
float value = showData[i].GetCurrData(1, updateDuration);
float pY = startY + i * scaleWid;
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
float dataHig = (value - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
float dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth;
np = new Vector3(pX + dataHig, pY);
serie.dataPoints.Add(np);
seriesHig[i] += dataHig;

View File

@@ -23,11 +23,14 @@ namespace XCharts
: serie.dataCount;
serie.animation.InitProgress(1, 0, 1);
var rate = serie.animation.GetCurrRate();
var updateDuration = serie.animation.GetUpdateAnimationDuration();
var dataChanging = false;
for (int n = serie.minShow; n < maxCount; n++)
{
var serieData = serie.GetDataList(m_DataZoom)[n];
float xValue = serieData.data[0];
float yValue = serieData.data[1];
float xValue = serieData.GetCurrData(0, updateDuration);
float yValue = serieData.GetCurrData(1, updateDuration);
if (serieData.IsDataChanged()) dataChanging = true;
float pX = coordinateX + xAxis.axisLine.width;
float pY = coordinateY + yAxis.axisLine.width;
float xDataHig = (xValue - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth;
@@ -69,6 +72,10 @@ namespace XCharts
m_IsPlayingStartAnimation = true;
RefreshChart();
}
if (dataChanging)
{
RefreshChart();
}
}
}
}

View File

@@ -76,12 +76,15 @@ namespace XCharts
if (sd.show && serie.pieRoseType == RoseType.Area) showdataCount++;
sd.canShowLabel = false;
}
bool dataChanging = false;
float updateDuration = serie.animation.GetUpdateAnimationDuration();
for (int n = 0; n < data.Count; n++)
{
if (!serie.animation.NeedAnimation(n)) break;
var serieData = data[n];
serieData.index = n;
float value = serieData.data[1];
float value = serieData.GetCurrData(1, updateDuration);
if (serieData.IsDataChanged()) dataChanging = true;
serieNameCount = m_LegendRealShowName.IndexOf(serieData.legendName);
Color color = m_ThemeInfo.GetColor(serieNameCount);
serieData.runtimePieStartAngle = startDegree;
@@ -168,6 +171,10 @@ namespace XCharts
serie.animation.CheckSymbol(Time.deltaTime * symbolSpeed, serie.symbol.size);
RefreshChart();
}
if (dataChanging)
{
RefreshChart();
}
}
DrawLabelLine(vh);
DrawLabelBackground(vh);

View File

@@ -218,6 +218,8 @@ namespace XCharts
continue;
}
var rate = serie.animation.GetCurrRate();
var dataChanging = false;
var updateDuration = serie.animation.GetUpdateAnimationDuration();
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
@@ -262,7 +264,8 @@ namespace XCharts
if (n >= serieData.data.Count) break;
float min = radar.GetIndicatorMin(n);
float max = radar.GetIndicatorMax(n);
float value = serieData.data[n];
float value = serieData.GetCurrData(n, updateDuration);
if (serieData.IsDataChanged()) dataChanging = true;
if (max == 0)
{
serie.GetMinMaxData(n, out min, out max);
@@ -320,6 +323,10 @@ namespace XCharts
serie.animation.CheckProgress(Time.deltaTime * speed);
RefreshChart();
}
if (dataChanging)
{
RefreshChart();
}
}
}