mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-21 07:50:16 +00:00
增加Animation的Exchange排序交换动画
This commit is contained in:
@@ -493,4 +493,14 @@ namespace XCharts.Runtime
|
||||
return m_Offset.value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Data exchange animation. Generally used for animation of data sorting.
|
||||
/// ||数据交换动画。一般用于图表数据排序时顺序变化的动画。
|
||||
/// </summary>
|
||||
[Since("v3.15.0")]
|
||||
[System.Serializable]
|
||||
public class AnimationExchange : AnimationInfo
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -44,8 +44,8 @@ namespace XCharts.Runtime
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// the animation of serie. support animation type: fadeIn, fadeOut, change, addition.
|
||||
/// ||动画组件,用于控制图表的动画播放。支持配置五种动画表现:FadeIn(渐入动画),FadeOut(渐出动画),Change(变更动画),Addition(新增动画),Interaction(交互动画)。
|
||||
/// the animation of serie. support animation type: fadeIn, fadeOut, change, addition, exchange.
|
||||
/// ||动画组件,用于控制图表的动画播放。支持配置五种动画表现:FadeIn(渐入动画),FadeOut(渐出动画),Change(变更动画),Addition(新增动画),Interaction(交互动画),Exchange(交换动画)。
|
||||
/// 按作用的对象可以分为两类:SerieAnimation(系列动画)和DataAnimation(数据动画)。
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
@@ -62,6 +62,7 @@ namespace XCharts.Runtime
|
||||
[SerializeField][Since("v3.8.0")] private AnimationAddition m_Addition = new AnimationAddition() { duration = 500 };
|
||||
[SerializeField][Since("v3.8.0")] private AnimationHiding m_Hiding = new AnimationHiding() { duration = 500 };
|
||||
[SerializeField][Since("v3.8.0")] private AnimationInteraction m_Interaction = new AnimationInteraction() { duration = 250 };
|
||||
[SerializeField][Since("v3.15.0")] private AnimationExchange m_Exchange = new AnimationExchange() { duration = 250 };
|
||||
|
||||
[Obsolete("Use animation.fadeIn.delayFunction instead.", true)]
|
||||
public AnimationDelayFunction fadeInDelayFunction;
|
||||
@@ -138,6 +139,11 @@ namespace XCharts.Runtime
|
||||
/// ||交互动画配置。
|
||||
/// </summary>
|
||||
public AnimationInteraction interaction { get { return m_Interaction; } }
|
||||
/// <summary>
|
||||
/// Exchange animation configuration. Valid in sort bar chart.
|
||||
/// ||交换动画配置。如在排序柱图中有效。
|
||||
/// </summary>
|
||||
public AnimationExchange exchange { get { return m_Exchange; } }
|
||||
|
||||
private Vector3 m_LinePathLastPos;
|
||||
private List<AnimationInfo> m_Animations;
|
||||
@@ -147,12 +153,15 @@ namespace XCharts.Runtime
|
||||
{
|
||||
if (m_Animations == null)
|
||||
{
|
||||
m_Animations = new List<AnimationInfo>();
|
||||
m_Animations.Add(m_FadeIn);
|
||||
m_Animations.Add(m_FadeOut);
|
||||
m_Animations.Add(m_Change);
|
||||
m_Animations.Add(m_Addition);
|
||||
m_Animations.Add(m_Hiding);
|
||||
m_Animations = new List<AnimationInfo>
|
||||
{
|
||||
m_FadeIn,
|
||||
m_FadeOut,
|
||||
m_Change,
|
||||
m_Addition,
|
||||
m_Hiding,
|
||||
m_Exchange
|
||||
};
|
||||
}
|
||||
return m_Animations;
|
||||
}
|
||||
@@ -565,6 +574,14 @@ namespace XCharts.Runtime
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float GetExchangeDuration()
|
||||
{
|
||||
if (m_Enable && m_Exchange.enable)
|
||||
return m_Exchange.context.currDuration > 0 ? m_Exchange.context.currDuration : m_Exchange.duration;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float GetAdditionDuration()
|
||||
{
|
||||
if (m_Enable && m_Addition.enable)
|
||||
|
||||
@@ -253,9 +253,9 @@ namespace XCharts
|
||||
var serie = chart.GetSerie(0);
|
||||
if (isCategory && serie != null && serie.useSortData)
|
||||
{
|
||||
var isY = axis is YAxis;
|
||||
var showData = serie.GetDataList(dataZoom, true);
|
||||
var isChanged = CheckSortedDataChanged(axis, showData);
|
||||
if (isChanged)
|
||||
if (CheckSortedDataChanged(axis, showData))
|
||||
{
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
@@ -268,6 +268,25 @@ namespace XCharts
|
||||
}
|
||||
SaveSortedDataIndex(axis, showData);
|
||||
}
|
||||
if (CheckSortedDataAnimation(axis, showData))
|
||||
{
|
||||
float diff = axis.context.scaleWidth / 2;
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
var labelObject = context.labelObjectList[i];
|
||||
if (labelObject != null)
|
||||
{
|
||||
if (i < showData.Count)
|
||||
{
|
||||
var serieData = showData[i];
|
||||
var pos = serieData.context.exchangePosition;
|
||||
if (ChartHelper.IsZeroVector(pos)) continue;
|
||||
var sourPos = labelObject.GetPosition();
|
||||
labelObject.SetPosition(isY ? new Vector3(sourPos.x, pos.y + diff) : new Vector3(pos.x + diff, sourPos.y));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -282,7 +301,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
private bool CheckSortedDataChanged(Axis axis, List<SerieData> dataList)
|
||||
private static bool CheckSortedDataChanged(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
if (dataList.Count != axis.context.sortedDataIndices.Count) return true;
|
||||
for (int i = 0; i < dataList.Count; i++)
|
||||
@@ -292,7 +311,17 @@ namespace XCharts
|
||||
return false;
|
||||
}
|
||||
|
||||
private void SaveSortedDataIndex(Axis axis, List<SerieData> dataList)
|
||||
private static bool CheckSortedDataAnimation(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
if (!axis.IsCategory()) return false;
|
||||
foreach (var data in dataList)
|
||||
{
|
||||
if (!data.context.exchangeEnd) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void SaveSortedDataIndex(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
axis.context.sortedDataIndices.Clear();
|
||||
for (int i = 0; i < dataList.Count; i++)
|
||||
@@ -484,7 +513,6 @@ namespace XCharts
|
||||
SerieHelper.UpdateSerieRuntimeFilterData(sortSerie);
|
||||
}
|
||||
var showData = sortSerie != null ? sortSerie.GetDataList(dataZoom, true) : null;
|
||||
|
||||
for (int i = 0; i < splitNumber; i++)
|
||||
{
|
||||
var labelWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
|
||||
|
||||
@@ -207,11 +207,13 @@ namespace XCharts.Runtime
|
||||
var dataChangeDuration = serie.animation.GetChangeDuration();
|
||||
var dataAddDuration = serie.animation.GetAdditionDuration();
|
||||
var interactDuration = serie.animation.GetInteractionDuration();
|
||||
var exchangeDuration = serie.animation.GetExchangeDuration();
|
||||
|
||||
var areaColor = ColorUtil.clearColor32;
|
||||
var areaToColor = ColorUtil.clearColor32;
|
||||
var interacting = false;
|
||||
|
||||
axis.context.scaleWidth = categoryWidth;
|
||||
serie.context.isHorizontal = isY;
|
||||
serie.containerIndex = m_SerieGrid.index;
|
||||
serie.containterInstanceId = m_SerieGrid.instanceId;
|
||||
@@ -249,7 +251,11 @@ namespace XCharts.Runtime
|
||||
var pY = 0f;
|
||||
UpdateXYPosition(m_SerieGrid, isY, axis, relativedAxis, i, categoryWidth, relativedCategoryWidth,
|
||||
barWidth, isStack, value, backgroundGap, ref pX, ref pY);
|
||||
var barHig = 0f;
|
||||
if (serie.useSortData)
|
||||
{
|
||||
serieData.context.UpdateExchangePosition(ref pX, ref pY, exchangeDuration);
|
||||
}
|
||||
float barHig;
|
||||
if (isPercentStack)
|
||||
{
|
||||
var valueTotal = chart.GetSerieSameStackTotalValue<Bar>(serie.stack, i, m_SerieGrid.index);
|
||||
|
||||
@@ -35,6 +35,19 @@ namespace XCharts.Runtime
|
||||
public float offsetRadius;
|
||||
public float outsideRadius;
|
||||
public Vector3 position;
|
||||
/// <summary>
|
||||
/// is the exchange animation end.
|
||||
/// ||交换动画是否结束。
|
||||
/// </summary>
|
||||
public bool exchangeEnd;
|
||||
/// <summary>
|
||||
/// the current position of the exchange animation.
|
||||
/// ||交换动画的当前位置。
|
||||
/// </summary>
|
||||
public Vector3 exchangePosition;
|
||||
private float exchangeStartTime;
|
||||
private Vector3 exchangeStartPosition;
|
||||
private Vector3 exchangeEndPosition;
|
||||
public List<Vector3> dataPoints = new List<Vector3>();
|
||||
public List<ChartLabel> dataLabels = new List<ChartLabel>();
|
||||
public List<SerieData> children = new List<SerieData>();
|
||||
@@ -77,9 +90,61 @@ namespace XCharts.Runtime
|
||||
symbol = null;
|
||||
rect = Rect.zero;
|
||||
subRect = Rect.zero;
|
||||
exchangeEnd = true;
|
||||
exchangeStartPosition = Vector3.zero;
|
||||
exchangePosition = Vector3.zero;
|
||||
exchangeEndPosition = Vector3.zero;
|
||||
children.Clear();
|
||||
dataPoints.Clear();
|
||||
dataLabels.Clear();
|
||||
}
|
||||
|
||||
public void UpdateExchangePosition(ref float x, ref float y, float totalTime)
|
||||
{
|
||||
if (exchangeEndPosition.x != x || exchangeEndPosition.y != y)
|
||||
{
|
||||
if (exchangeStartPosition == Vector3.zero || Time.time - exchangeStartTime < 0.1f)
|
||||
{
|
||||
exchangeEnd = true;
|
||||
exchangeStartTime = Time.time;
|
||||
exchangeEndPosition.x = x;
|
||||
exchangeEndPosition.y = y;
|
||||
exchangeStartPosition = exchangeEndPosition;
|
||||
exchangePosition = exchangeEndPosition;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
exchangeEnd = false;
|
||||
exchangeStartTime = Time.time;
|
||||
exchangeStartPosition = exchangePosition;
|
||||
exchangeEndPosition.x = x;
|
||||
exchangeEndPosition.y = y;
|
||||
}
|
||||
}
|
||||
if (exchangeStartPosition == exchangeEndPosition)
|
||||
{
|
||||
exchangeEnd = true;
|
||||
exchangePosition = exchangeEndPosition;
|
||||
x = exchangePosition.x;
|
||||
y = exchangePosition.y;
|
||||
return;
|
||||
}
|
||||
var spendTime = Time.time - exchangeStartTime;
|
||||
totalTime /= 1000;
|
||||
if (spendTime >= totalTime)
|
||||
{
|
||||
exchangeEnd = true;
|
||||
exchangeStartPosition = exchangeEndPosition;
|
||||
exchangePosition = exchangeEndPosition;
|
||||
x = exchangePosition.x;
|
||||
y = exchangePosition.y;
|
||||
return;
|
||||
}
|
||||
exchangePosition = Vector3.Lerp(exchangeStartPosition, exchangeEndPosition, spendTime / totalTime);
|
||||
x = exchangePosition.x;
|
||||
y = exchangePosition.y;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user