增加AnimationExchange排序交换动画

This commit is contained in:
monitor1394
2025-03-26 08:28:27 +08:00
parent 9e07617cc4
commit 0b218f6dfe
11 changed files with 365 additions and 28 deletions

View File

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

View File

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

View File

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