From f32808a36dd19e9c2fea7a8c0c878eb6de225de9 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sat, 13 Aug 2022 13:38:02 +0800 Subject: [PATCH] [bug][datazoom] fix chart display error when datazoom enable. --- CHANGELOG.md | 1 + Runtime/Component/Tooltip/TooltipHandler.cs | 10 ++++++++-- Runtime/Internal/BaseChart.cs | 1 + Runtime/Serie/Bar/BarHandler.cs | 7 ++++++- Runtime/Serie/Bar/SimplifiedBarHandler.cs | 2 ++ Runtime/Serie/Candlestick/CandlestickHandler.cs | 2 ++ .../Candlestick/SimplifiedCandlestickHandler.cs | 2 ++ Runtime/Serie/Heatmap/HeatmapHandler.cs | 4 ++-- Runtime/Serie/Line/LineHandler.GridCoord.cs | 12 ++++++++---- Runtime/Serie/Line/SimplifiedLineHandler.cs | 1 + Runtime/Serie/Parallel/ParallelHandler.cs | 1 - Runtime/Serie/Pie/PieHandler.cs | 1 - Runtime/Serie/Radar/RadarHandler.cs | 5 +---- Runtime/Serie/Ring/RingHandler.cs | 2 -- Runtime/Serie/Scatter/BaseScatterHandler.cs | 2 ++ Runtime/Serie/SerieContext.cs | 4 ++++ Runtime/Serie/SerieData.cs | 4 ++++ Runtime/Serie/SerieHandler.cs | 12 ++++++++---- 18 files changed, 52 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d45b9baf..30e9f5ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ ### 日志详情 +* (2022.08.13) 修复`DataZoom`组件开启时图表显示效果可能不正确的问题 * (2022.08.11) 优化`Tooltip`支持`ignoreDataDefaultContent` * (2022.08.10) 修复`Chart`在3D相机下部分组件显示异常的问题 * (2022.08.10) 修复`RemoveSerie()`接口不生效的问题 (#219) diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 4012efd2..a03205a6 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -293,7 +293,6 @@ namespace XCharts.Runtime for (int i = 0; i < dataCount; i++) { var serieData = serie.data[i]; - serieData.index = i; serie.context.sortedData.Add(serieData); } serie.context.sortedData.Sort(delegate(SerieData a, SerieData b) @@ -490,7 +489,6 @@ namespace XCharts.Runtime private void DrawXAxisIndicator(VertexHelper vh, Tooltip tooltip, GridCoord grid) { - var xAxes = chart.GetChartComponents(); var lineType = tooltip.lineStyle.GetType(chart.theme.tooltip.lineType); var lineWidth = tooltip.lineStyle.GetWidth(chart.theme.tooltip.lineWidth); @@ -512,6 +510,8 @@ namespace XCharts.Runtime pX += xAxis.IsCategory() ? (float) (xAxis.context.pointerValue * splitWidth + (xAxis.boundaryGap ? splitWidth / 2 : 0)) : xAxis.GetDistance(xAxis.context.axisTooltipValue, grid.context.width); + if (pX < grid.context.x) + break; Vector2 sp = new Vector2(pX, grid.context.y); Vector2 ep = new Vector2(pX, grid.context.y + grid.context.height); var lineColor = TooltipHelper.GetLineColor(tooltip, chart.theme); @@ -529,6 +529,8 @@ namespace XCharts.Runtime float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth; pX = (float) (grid.context.x + splitWidth * xAxis.context.pointerValue - (xAxis.boundaryGap ? 0 : splitWidth / 2)); + if (pX < grid.context.x) + break; float pY = grid.context.y + grid.context.height; Vector3 p1 = new Vector3(pX, grid.context.y); Vector3 p2 = new Vector3(pX, pY); @@ -571,6 +573,8 @@ namespace XCharts.Runtime case Tooltip.Type.Line: float pY = (float) (grid.context.y + yAxis.context.pointerValue * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0)); + if (pY < grid.context.y) + break; Vector2 sp = new Vector2(grid.context.x, pY); Vector2 ep = new Vector2(grid.context.x + grid.context.width, pY); var lineColor = TooltipHelper.GetLineColor(tooltip, chart.theme); @@ -589,6 +593,8 @@ namespace XCharts.Runtime float pX = grid.context.x + grid.context.width; pY = (float) (grid.context.y + splitWidth * yAxis.context.pointerValue - (yAxis.boundaryGap ? 0 : splitWidth / 2)); + if (pY < grid.context.y) + break; Vector3 p1 = new Vector3(grid.context.x, pY); Vector3 p2 = new Vector3(grid.context.x, pY + tooltipSplitWid); Vector3 p3 = new Vector3(pX, pY + tooltipSplitWid); diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 266d53d6..fdbf414e 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -575,6 +575,7 @@ namespace XCharts.Runtime var serie = m_Series[i]; serie.context.colorIndex = GetLegendRealShowNameIndex(serie.legendName); serie.context.dataPoints.Clear(); + serie.context.dataIndexs.Clear(); serie.context.dataIgnores.Clear(); serie.animation.context.isAllItemAnimationEnd = true; if (!serie.context.pointerEnter) diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index bd0b62a8..5b4558ff 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -176,10 +176,10 @@ namespace XCharts.Runtime for (int i = serie.minShow; i < maxCount; i++) { var serieData = showData[i]; - serieData.index = i; if (!serieData.show || serie.IsIgnoreValue(serieData)) { serie.context.dataPoints.Add(Vector3.zero); + serie.context.dataIndexs.Add(serieData.index); continue; } @@ -228,9 +228,14 @@ namespace XCharts.Runtime Rect.MinMaxRect(plb.x, m_SerieGrid.context.y, prb.x, m_SerieGrid.context.y + relativedAxisLength); if (!serie.clip || (serie.clip && m_SerieGrid.Contains(top))) + { serie.context.dataPoints.Add(top); + serie.context.dataIndexs.Add(serieData.index); + } else + { continue; + } if (serie.show && currHig != 0 && !serie.placeHolder) { diff --git a/Runtime/Serie/Bar/SimplifiedBarHandler.cs b/Runtime/Serie/Bar/SimplifiedBarHandler.cs index fdcf7b01..447c48db 100644 --- a/Runtime/Serie/Bar/SimplifiedBarHandler.cs +++ b/Runtime/Serie/Bar/SimplifiedBarHandler.cs @@ -152,6 +152,7 @@ namespace XCharts.Runtime if (!serieData.show || serie.IsIgnoreValue(serieData)) { serie.context.dataPoints.Add(Vector3.zero); + serie.context.dataIndexs.Add(serieData.index); continue; } @@ -184,6 +185,7 @@ namespace XCharts.Runtime serieData.context.position = top; serieData.context.rect = Rect.MinMaxRect(plb.x, plb.y, prb.x, prt.y); serie.context.dataPoints.Add(top); + serie.context.dataIndexs.Add(serieData.index); DrawNormalBar(vh, serie, serieData, itemStyle, colorIndex, highlight, gap, barWidth, pX, pY, plb, plt, prt, prb, false, m_SerieGrid, areaColor, areaToColor); diff --git a/Runtime/Serie/Candlestick/CandlestickHandler.cs b/Runtime/Serie/Candlestick/CandlestickHandler.cs index 19d3aaf8..dcbf690c 100644 --- a/Runtime/Serie/Candlestick/CandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/CandlestickHandler.cs @@ -111,6 +111,7 @@ namespace XCharts.Runtime if (serie.IsIgnoreValue(serieData)) { serie.context.dataPoints.Add(Vector3.zero); + serie.context.dataIndexs.Add(serieData.index); continue; } var state = SerieHelper.GetSerieState(serie, serieData); @@ -154,6 +155,7 @@ namespace XCharts.Runtime top = chart.ClampInGrid(grid, top); } serie.context.dataPoints.Add(top); + serie.context.dataIndexs.Add(serieData.index); var areaColor = isRise ? itemStyle.GetColor(theme.serie.candlestickColor) : itemStyle.GetColor0(theme.serie.candlestickColor0); diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs index 3b83497b..8266c6be 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs @@ -113,6 +113,7 @@ namespace XCharts.Runtime if (serie.IsIgnoreValue(serieData)) { serie.context.dataPoints.Add(Vector3.zero); + serie.context.dataIndexs.Add(serieData.index); continue; } var open = serieData.GetCurrData(0, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); @@ -154,6 +155,7 @@ namespace XCharts.Runtime // top = chart.ClampInGrid(grid, top); // } serie.context.dataPoints.Add(top); + serie.context.dataIndexs.Add(serieData.index); var areaColor = isRise ? itemStyle.GetColor(theme.serie.candlestickColor) : itemStyle.GetColor0(theme.serie.candlestickColor0); diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index 9f9fc7bc..806908b2 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -155,7 +155,6 @@ namespace XCharts.Runtime ChartConst.clearColor32; borderToColor.a = (byte) (borderToColor.a * serie.itemStyle.opacity); - serie.context.dataPoints.Clear(); serie.animation.InitProgress(0, xCount); var animationIndex = serie.animation.GetCurrIndex(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); @@ -165,13 +164,13 @@ namespace XCharts.Runtime for (int n = 0; n < serie.dataCount; n++) { var serieData = serie.data[n]; - serieData.index = n; var i = (int) serieData.GetData(0); var j = (int) serieData.GetData(1); var dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count); if (serie.IsIgnoreValue(serieData, dimension)) { serie.context.dataPoints.Add(Vector3.zero); + serie.context.dataIndexs.Add(serieData.index); continue; } var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse, @@ -180,6 +179,7 @@ namespace XCharts.Runtime var pos = new Vector3(zeroX + (i + (xAxis.boundaryGap ? 0.5f : 0)) * xWidth, zeroY + (j + (yAxis.boundaryGap ? 0.5f : 0)) * yWidth); serie.context.dataPoints.Add(pos); + serie.context.dataIndexs.Add(serieData.index); serieData.context.position = pos; serieData.context.canShowLabel = false; diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index c2dfb891..c3760d1c 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -109,13 +109,16 @@ namespace XCharts.Runtime { serie.context.pointerEnter = true; serie.context.pointerItemDataIndex = serieData.index; - serie.interact.SetValue(ref needInteract, lineWidth, true); } } if (lastIndex != serie.context.pointerItemDataIndex) { needInteract = true; } + if (serie.context.pointerItemDataIndex >= 0) + serie.interact.SetValue(ref needInteract, lineWidth, true, chart.theme.serie.selectedRate); + else + serie.interact.SetValue(ref needInteract, lineWidth); } if (needInteract) { @@ -148,7 +151,8 @@ namespace XCharts.Runtime for (int i = 0; i < count; i++) { - var serieData = serie.GetSerieData(i); + var index = serie.context.dataIndexs[i]; + var serieData = serie.GetSerieData(index); if (serieData == null) continue; if (serieData.context.isClip) @@ -156,7 +160,7 @@ namespace XCharts.Runtime var state = SerieHelper.GetSerieState(serie, serieData, true); var symbol = SerieHelper.GetSerieSymbol(serie, serieData, state); - if (!symbol.show || !symbol.ShowSymbol(i, count)) + if (!symbol.show || !symbol.ShowSymbol(index, count)) continue; var pos = serie.context.dataPoints[i]; @@ -178,7 +182,6 @@ namespace XCharts.Runtime serieData.interact.SetValue(ref interacting, symbolSize); symbolSize = serie.animation.GetSysmbolSize(symbolSize); } - float symbolBorder = 0f; float[] cornerRadius = null; Color32 symbolColor, symbolToColor, symbolEmptyColor, borderColor; @@ -335,6 +338,7 @@ namespace XCharts.Runtime serie.context.dataIgnores.Add(false); serieData.context.position = np; serie.context.dataPoints.Add(np); + serie.context.dataIndexs.Add(serieData.index); lp = np; } } diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 6dc172d2..89d15938 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -208,6 +208,7 @@ namespace XCharts.Runtime serieData.context.position = np; serie.context.dataPoints.Add(np); + serie.context.dataIndexs.Add(serieData.index); serie.context.dataIgnores.Add(false); } } diff --git a/Runtime/Serie/Parallel/ParallelHandler.cs b/Runtime/Serie/Parallel/ParallelHandler.cs index 717a0ad2..c126f576 100644 --- a/Runtime/Serie/Parallel/ParallelHandler.cs +++ b/Runtime/Serie/Parallel/ParallelHandler.cs @@ -51,7 +51,6 @@ namespace XCharts.Runtime serie.animation.InitProgress(currDetailProgress, totalDetailProgress); - serie.context.dataPoints.Clear(); serie.containerIndex = parallel.index; serie.containterInstanceId = parallel.instanceId; diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index c06a4a18..966ebe01 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -195,7 +195,6 @@ namespace XCharts.Runtime for (int n = 0; n < data.Count; n++) { var serieData = data[n]; - serieData.index = n; var value = isAllZeroValue ? zeroReplaceValue : serieData.GetCurrData(1, dataChangeDuration); serieData.context.startAngle = startDegree; serieData.context.toAngle = startDegree; diff --git a/Runtime/Serie/Radar/RadarHandler.cs b/Runtime/Serie/Radar/RadarHandler.cs index 403a35fa..c01e80bf 100644 --- a/Runtime/Serie/Radar/RadarHandler.cs +++ b/Runtime/Serie/Radar/RadarHandler.cs @@ -110,7 +110,6 @@ namespace XCharts.Runtime for (int i = 0; i < serie.data.Count; i++) { var serieData = serie.data[i]; - serieData.index = i; var symbol = SerieHelper.GetSerieSymbol(serie, serieData); var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); if (needHideAll || m_LegendEnter) @@ -159,7 +158,6 @@ namespace XCharts.Runtime for (int i = 0; i < serie.data.Count; i++) { var serieData = serie.data[i]; - serieData.index = i; var size = SerieHelper.GetSysmbolSize(serie, serieData, chart.theme, themeSymbolSize); if (Vector3.Distance(chart.pointerPos, serieData.context.position) < size * 2) { @@ -351,7 +349,6 @@ namespace XCharts.Runtime var angle = 2 * Mathf.PI / indicatorNum; var centerPos = m_RadarCoord.context.center; serie.animation.InitProgress(0, 1); - serie.context.dataPoints.Clear(); if (!serie.show || serie.animation.HasFadeOut()) { return; @@ -371,7 +368,6 @@ namespace XCharts.Runtime for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; - serieData.index = j; string dataName = serieData.name; if (!serieData.show) @@ -430,6 +426,7 @@ namespace XCharts.Runtime lastColor = lineColor; } serie.context.dataPoints.Add(startPoint); + serie.context.dataIndexs.Add(serieData.index); serieData.context.position = startPoint; serieData.context.labelPosition = startPoint; diff --git a/Runtime/Serie/Ring/RingHandler.cs b/Runtime/Serie/Ring/RingHandler.cs index 643b6711..c4a87e25 100644 --- a/Runtime/Serie/Ring/RingHandler.cs +++ b/Runtime/Serie/Ring/RingHandler.cs @@ -152,7 +152,6 @@ namespace XCharts.Runtime for (int j = 0; j < data.Count; j++) { var serieData = data[j]; - serieData.index = j; if (!serieData.show) continue; if (serieData.IsDataChanged()) dataChanging = true; var value = serieData.GetFirstData(dataChangeDuration); @@ -303,7 +302,6 @@ namespace XCharts.Runtime for (int i = 0; i < serie.data.Count; i++) { var serieData = serie.data[i]; - serieData.index = i; if (dist >= serieData.context.insideRadius && dist <= serieData.context.outsideRadius && angle >= serieData.context.startAngle && diff --git a/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Runtime/Serie/Scatter/BaseScatterHandler.cs index fa703995..0d9be98f 100644 --- a/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -172,6 +172,7 @@ namespace XCharts.Runtime continue; serie.context.dataPoints.Add(pos); + serie.context.dataIndexs.Add(serieData.index); serieData.context.position = pos; var datas = serieData.data; var symbolSize = 0f; @@ -276,6 +277,7 @@ namespace XCharts.Runtime pos = new Vector3(axis.context.x + xDataHig, axis.context.y + yDataHig); } serie.context.dataPoints.Add(pos); + serie.context.dataIndexs.Add(serieData.index); serieData.context.position = pos; var datas = serieData.data; diff --git a/Runtime/Serie/SerieContext.cs b/Runtime/Serie/SerieContext.cs index f996821d..4408e499 100644 --- a/Runtime/Serie/SerieContext.cs +++ b/Runtime/Serie/SerieContext.cs @@ -96,6 +96,10 @@ namespace XCharts.Runtime /// public List dataIgnores = new List(); /// + /// 数据对应的index索引。dataIndexs 和 dataPoints 一一对应。 + /// + public List dataIndexs = new List(); + /// /// 排序后的数据 /// public List sortedData = new List(); diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index 950f7473..bd43a936 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -549,6 +549,10 @@ namespace XCharts.Runtime public void SetLabelActive(bool flag) { if (labelObject != null) labelObject.SetActive(flag); + foreach (var labelObject in context.dataLabels) + { + labelObject.SetActive(false); + } } public void SetIconActive(bool flag) { diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index c8cc95ce..ef77c1c1 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -368,10 +368,18 @@ namespace XCharts.Runtime return; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var needCheck = serie.context.dataIndexs.Count > 0; foreach (var serieData in serie.data) { if (serieData.labelObject == null && serieData.context.dataLabels.Count <= 0) + { continue; + } + if (needCheck && !serie.context.dataIndexs.Contains(serieData.index)) + { + serieData.SetLabelActive(false); + continue; + }; var currLabel = SerieHelper.GetSerieLabel(serie, serieData); var isIgnore = serie.IsIgnoreIndex(serieData.index, defaultDimension); if (serie.show && @@ -429,10 +437,6 @@ namespace XCharts.Runtime else { serieData.SetLabelActive(false); - foreach (var labelObject in serieData.context.dataLabels) - { - labelObject.SetActive(false); - } } } }