mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-14 20:00:09 +00:00
完善Chart的onSerieEnter,onSerieExit和onSerieClick回调
This commit is contained in:
@@ -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`表现效果
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<GridCoord>())
|
||||
UpdateSerieGridContext();
|
||||
else if (serie.IsUseCoord<PolarCoord>())
|
||||
|
||||
@@ -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;
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user