diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index a91a63e5..491577a3 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -120,14 +120,37 @@ namespace XCharts.Runtime } /// /// Redraw chart in next frame. - /// |在下一帧刷新图表。 + /// |在下一帧刷新整个图表。 /// public void RefreshChart() { + foreach (var serie in m_Series) + serie.ResetInteract(); m_RefreshChart = true; if (m_Painter) m_Painter.Refresh(); } + /// + /// Redraw chart serie in next frame. + /// |在下一帧刷新图表的指定serie。 + /// + public void RefreshChart(int serieIndex) + { + RefreshPainter(GetSerie(serieIndex)); + } + + /// + /// Redraw chart serie in next frame. + /// |在下一帧刷新图表的指定serie。 + /// + public void RefreshChart(Serie serie) + { + if (serie == null) return; + serie.ResetInteract(); + RefreshPainter(serie); + } + + /// /// Remove all series and legend data. /// |It just emptying all of serie's data without emptying the list of series. diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 7245d879..50afe53e 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -211,6 +211,7 @@ namespace XCharts.Runtime public void RefreshPainter(Serie serie) { + if (serie == null) return; RefreshPainter(GetPainterIndexBySerie(serie)); } @@ -363,9 +364,7 @@ namespace XCharts.Runtime if (m_Painter == null) return; if (m_RefreshChart) { - m_Painter.Refresh(); - foreach (var painter in m_PainterList) painter.Refresh(); - if (m_PainterTop != null) m_PainterTop.Refresh(); + CheckRefreshPainter(); m_RefreshChart = false; } } @@ -553,6 +552,8 @@ namespace XCharts.Runtime serie.context.dataPoints.Clear(); serie.context.dataIgnores.Clear(); serie.animation.context.isAllItemAnimationEnd = true; + if (!serie.context.pointerEnter) + serie.ResetInteract(); if (m_OnDrawSerieBefore != null) { diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index 005e9bd6..88f7ccdf 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -63,14 +63,10 @@ namespace XCharts.Runtime serie.context.pointerEnter = false; foreach (var serieData in serie.data) { - var barColor = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, false); - var barToColor = SerieHelper.GetItemToColor(serie, serieData, chart.theme, serie.context.colorIndex, false); - serieData.interact.SetColor(ref needInteract, barColor, barToColor); - } - if (needInteract) - { - chart.RefreshPainter(serie); + serieData.context.highlight = false; + serieData.interact.Reset(); } + chart.RefreshPainter(serie); } return; } diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index 300733b2..e0a83cfd 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -26,25 +26,17 @@ namespace XCharts.Runtime { if (m_LastCheckContextFlag != needCheck) { - var needAnimation1 = false; m_LastCheckContextFlag = needCheck; serie.context.pointerItemDataIndex = -1; serie.context.pointerEnter = false; - serie.interact.SetValue(ref needAnimation1, lineWidth, false); foreach (var serieData in serie.data) { - var symbol = SerieHelper.GetSerieSymbol(serie, serieData); - var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); - serieData.context.highlight = false; - serieData.interact.SetValue(ref needAnimation1, symbolSize); - } - if (needAnimation1) - { - if (SeriesHelper.IsStack(chart.series)) - chart.RefreshTopPainter(); - else - chart.RefreshPainter(serie); + serieData.interact.Reset(); } + if (SeriesHelper.IsStack(chart.series)) + chart.RefreshTopPainter(); + else + chart.RefreshPainter(serie); } return; } diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 8539ac35..0719cc3e 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -821,12 +821,14 @@ namespace XCharts.Runtime return m_VertsDirty || symbol.vertsDirty || lineStyle.vertsDirty || - (lineArrow != null && lineArrow.vertsDirty) || itemStyle.vertsDirty || + (lineArrow != null && lineArrow.vertsDirty) || (areaStyle != null && areaStyle.vertsDirty) || (label != null && label.vertsDirty) || + (labelLine != null && labelLine.vertsDirty) || (emphasis != null && emphasis.vertsDirty) || - (titleStyle != null && titleStyle.vertsDirty); + (titleStyle != null && titleStyle.vertsDirty) || + AnySerieDataVerticesDirty(); } } @@ -835,12 +837,17 @@ namespace XCharts.Runtime get { return m_ComponentDirty - || (titleStyle != null && titleStyle.componentDirty); + || symbol.componentDirty + || (titleStyle != null && titleStyle.componentDirty) + || (label != null && label.componentDirty) + || (labelLine != null && labelLine.componentDirty); } } public override void ClearVerticesDirty() { base.ClearVerticesDirty(); + foreach (var serieData in m_Data) + serieData.ClearVerticesDirty(); symbol.ClearVerticesDirty(); lineStyle.ClearVerticesDirty(); itemStyle.ClearVerticesDirty(); @@ -859,6 +866,8 @@ namespace XCharts.Runtime public override void ClearComponentDirty() { base.ClearComponentDirty(); + foreach (var serieData in m_Data) + serieData.ClearComponentDirty(); symbol.ClearComponentDirty(); lineStyle.ClearComponentDirty(); itemStyle.ClearComponentDirty(); @@ -880,6 +889,24 @@ namespace XCharts.Runtime labelDirty = true; titleDirty = true; } + + private bool AnySerieDataVerticesDirty() + { + if (this is ISimplifiedSerie) + return false; + foreach (var serieData in m_Data) + if (serieData.vertsDirty) return true; + return false; + } + + private bool AnySerieDataComponentDirty() + { + if (this is ISimplifiedSerie) + return false; + foreach (var serieData in m_Data) + if (serieData.componentDirty) return true; + return false; + } /// /// Whether the serie is highlighted. /// |该系列是否高亮,一般由图例悬停触发。 @@ -1032,6 +1059,12 @@ namespace XCharts.Runtime } } + public void ResetInteract() + { + foreach (var serieData in m_Data) + serieData.interact.Reset(); + } + /// /// 清空所有数据 /// diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index cd27ddb8..a08cd5a4 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -105,6 +105,54 @@ namespace XCharts.Runtime private List m_DataUpdateFlag = new List(); private List m_PolygonPoints = new List(); + public override bool vertsDirty + { + get + { + return m_VertsDirty + || (labelLine != null && labelLine.vertsDirty) + || (itemStyle != null && itemStyle.vertsDirty) + || (symbol != null && symbol.vertsDirty) + || (lineStyle != null && lineStyle.vertsDirty) + || (areaStyle != null && areaStyle.vertsDirty); + } + } + public override bool componentDirty + { + get + { + return m_ComponentDirty + || (labelStyle != null && labelStyle.componentDirty) + || (labelLine != null && labelLine.componentDirty) + || (titleStyle != null && titleStyle.componentDirty) + || (emphasis != null && emphasis.componentDirty); + } + } + + public override void ClearVerticesDirty() + { + base.ClearVerticesDirty(); + if (labelLine != null) labelLine.ClearVerticesDirty(); + if (itemStyle != null) itemStyle.ClearVerticesDirty(); + if (lineStyle != null) lineStyle.ClearVerticesDirty(); + if (areaStyle != null) areaStyle.ClearVerticesDirty(); + if (areaStyle != null) areaStyle.ClearVerticesDirty(); + if (symbol != null) symbol.ClearVerticesDirty(); + if (emphasis != null) emphasis.ClearVerticesDirty(); + } + + public override void ClearComponentDirty() + { + base.ClearComponentDirty(); + if (labelLine != null) labelLine.ClearComponentDirty(); + if (itemStyle != null) itemStyle.ClearComponentDirty(); + if (lineStyle != null) lineStyle.ClearComponentDirty(); + if (areaStyle != null) areaStyle.ClearComponentDirty(); + if (areaStyle != null) areaStyle.ClearComponentDirty(); + if (symbol != null) symbol.ClearComponentDirty(); + if (emphasis != null) emphasis.ClearComponentDirty(); + } + public void Reset() { index = 0;