diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 89d1172a..75a17591 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -72,9 +72,11 @@ slug: /changelog * 重构和完善动画系统,增加`新增动画`和`交互动画`的支持 * 完善`PieChart`的动画交互表现 * 增加`Symbol`的`EmptyTriangle`、`EmptyDiamond`、`Plus`、`Minus`四种新标记 +* 完善图表的交互回调 日志详情: +* (2023.08.03) 完善`Chart`的`onSerieEnter`,`onSerieExit`和`onSerieClick`回调 * (2023.08.02) 修复`BarChart`的`onSerieEnter`和`onSerieExit`回调无效的问题 * (2023.08.02) 增加`Symbol`的`Plus`加号和`Minus`减号的支持 * (2023.07.31) 增加`Symbol`的`EmptyTriangle`和`EmptyDiamond`的支持,优化`Symbol`表现效果 diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 0ef14c3d..94d995a9 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -195,6 +195,7 @@ namespace XCharts.Runtime foreach (var handler in m_SerieHandlers) handler.BeforeUpdate(); foreach (var handler in m_ComponentHandlers) handler.Update(); foreach (var handler in m_SerieHandlers) handler.Update(); + foreach (var handler in m_SerieHandlers) handler.AfterUpdate(); m_DebugInfo.Update(); if (m_OnUpdate != null) m_OnUpdate(); diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index f1d10adf..0cc1faa3 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -13,9 +13,8 @@ namespace XCharts.Runtime private GridCoord m_SerieGrid; private float[] m_CapusleDefaultCornerRadius = new float[] { 1, 1, 1, 1 }; - public override void Update() + public override void UpdateSerieContext() { - base.Update(); if (serie.IsUseCoord()) UpdateSerieGridContext(); else if (serie.IsUseCoord()) diff --git a/Runtime/Serie/Line/LineHandler.cs b/Runtime/Serie/Line/LineHandler.cs index 9e4d7698..e06fa144 100644 --- a/Runtime/Serie/Line/LineHandler.cs +++ b/Runtime/Serie/Line/LineHandler.cs @@ -98,26 +98,26 @@ namespace XCharts.Runtime } } - public override int GetPointerItemDataIndex() - { - var symbolSize = SerieHelper.GetSysmbolSize(serie, null, chart.theme.serie.lineSymbolSize) * 1.5f; - var count = serie.context.dataPoints.Count; - for (int i = 0; i < count; i++) - { - var index = serie.context.dataIndexs[i]; - var serieData = serie.GetSerieData(index); - if (serieData == null) - continue; - if (serieData.context.isClip) - continue; + // public override int GetPointerItemDataIndex() + // { + // var symbolSize = SerieHelper.GetSysmbolSize(serie, null, chart.theme.serie.lineSymbolSize) * 1.5f; + // var count = serie.context.dataPoints.Count; + // for (int i = 0; i < count; i++) + // { + // var index = serie.context.dataIndexs[i]; + // var serieData = serie.GetSerieData(index); + // if (serieData == null) + // continue; + // if (serieData.context.isClip) + // continue; - var pos = serie.context.dataPoints[i]; - if (Vector2.Distance(pos, chart.pointerPos) < symbolSize) - { - return i; - } - } - return -1; - } + // var pos = serie.context.dataPoints[i]; + // if (Vector2.Distance(pos, chart.pointerPos) < symbolSize) + // { + // return i; + // } + // } + // return -1; + // } } } \ No newline at end of file diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 9cce8d39..1386826f 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -17,6 +17,7 @@ namespace XCharts.Runtime public virtual void CheckComponent(StringBuilder sb) { } public virtual void BeforeUpdate() { } public virtual void Update() { } + public virtual void AfterUpdate() { } public virtual void DrawBase(VertexHelper vh) { } public virtual void DrawSerie(VertexHelper vh) { } public virtual void DrawUpper(VertexHelper vh) { } @@ -69,6 +70,7 @@ namespace XCharts.Runtime private float[] m_LastCenter = new float[2] { 0, 0 }; private bool m_LastPointerEnter; private int m_LastPointerDataIndex; + private int m_LastPointerDataDimension; public T serie { get; internal set; } public GameObject labelObject { get { return m_SerieLabelRoot; } } @@ -85,6 +87,9 @@ namespace XCharts.Runtime { m_LastPointerEnter = serie.context.pointerEnter; m_LastPointerDataIndex = serie.context.pointerItemDataIndex; + m_LastPointerDataDimension = GetPointerItemDataDimension(); + serie.context.pointerEnter = false; + serie.context.pointerItemDataIndex = -1; } public override void Update() @@ -146,6 +151,10 @@ namespace XCharts.Runtime serie.interactDirty = false; m_ForceUpdateSerieContext = true; } + } + + public override void AfterUpdate() + { UpdateSerieContextInternal(); } @@ -176,25 +185,34 @@ namespace XCharts.Runtime m_ForceUpdateSerieContext = false; if (m_LastPointerEnter != serie.context.pointerEnter || m_LastPointerDataIndex != serie.context.pointerItemDataIndex) { - if (chart.onSerieEnter != null || chart.onSerieExit != null || serie.onEnter != null || serie.onExit != null) { - var dataIndex = GetPointerItemDataIndex(); - var dimension = GetPointerItemDataDimension(); - var value = serie.GetData(dataIndex, dimension); - var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value); if (serie.context.pointerEnter) { - if (serie.onEnter != null) serie.onEnter(data); - if (chart.onSerieEnter != null) chart.onSerieEnter(data); + if ((serie.onExit != null || chart.onSerieExit != null) && m_LastPointerDataIndex >= 0) + { + var dataValue = serie.GetData(m_LastPointerDataIndex, m_LastPointerDataDimension); + var exitEventData = SerieEventDataPool.Get(chart.pointerPos, serie.index, m_LastPointerDataIndex, m_LastPointerDataDimension, dataValue); + if (serie.onExit != null) serie.onExit(exitEventData); + if (chart.onSerieExit != null) chart.onSerieExit(exitEventData); + SerieEventDataPool.Release(exitEventData); + } + var dataIndex = GetPointerItemDataIndex(); + var dimension = GetPointerItemDataDimension(); + var value = serie.GetData(dataIndex, dimension); + var enterEventData = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value); + if (serie.onEnter != null) serie.onEnter(enterEventData); + if (chart.onSerieEnter != null) chart.onSerieEnter(enterEventData); + SerieEventDataPool.Release(enterEventData); } - else + else if (m_LastPointerDataIndex >= 0) { - data.dataIndex = m_LastPointerDataIndex; - if (serie.onExit != null) serie.onExit(data); - if (chart.onSerieExit != null) chart.onSerieExit(data); + var dataValue = serie.GetData(m_LastPointerDataIndex, m_LastPointerDataDimension); + var exitEventData = SerieEventDataPool.Get(chart.pointerPos, serie.index, m_LastPointerDataIndex, m_LastPointerDataDimension, dataValue); + if (serie.onExit != null) serie.onExit(exitEventData); + if (chart.onSerieExit != null) chart.onSerieExit(exitEventData); + SerieEventDataPool.Release(exitEventData); } - SerieEventDataPool.Release(data); } } }