diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 87946a32..b5d5aca2 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -73,6 +73,7 @@ slug: /changelog ## master +* (2024.04.12) 修复`Candlesticks`效果不对的问题 (#313) * (2024.03.20) 增加`Tooltip`的`triggerOn`设置触发条件 * (2024.03.19) 修复`Pie`在设置`ItemStyle`的`opacity`时颜色不对的问题 (#309) diff --git a/Runtime/Serie/Candlestick/Candlestick.cs b/Runtime/Serie/Candlestick/Candlestick.cs index 26583938..dcfbfddf 100644 --- a/Runtime/Serie/Candlestick/Candlestick.cs +++ b/Runtime/Serie/Candlestick/Candlestick.cs @@ -17,13 +17,17 @@ namespace XCharts.Runtime { var serie = chart.AddSerie(serieName); var defaultDataCount = 5; - for (int i = 0; i < defaultDataCount; i++) + var lastValue = 50d; + for (int i = 0; i < 5; i++) { - var open = Random.Range(20, 60); - var close = Random.Range(40, 90); - var lowest = Random.Range(0, 50); - var heighest = Random.Range(50, 100); + var open = lastValue; + var close = open + Random.Range(-20, 20); + var min = open < close ? open : close; + var max = open > close ? open : close; + var lowest = min + Random.Range(-10, -10); + var heighest = max + Random.Range(10, 10); chart.AddData(serie.index, i, open, close, lowest, heighest); + lastValue = close; } return serie; } diff --git a/Runtime/Serie/Candlestick/CandlestickHandler.cs b/Runtime/Serie/Candlestick/CandlestickHandler.cs index da9f9898..7e8c0cde 100644 --- a/Runtime/Serie/Candlestick/CandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/CandlestickHandler.cs @@ -124,7 +124,7 @@ namespace XCharts.Runtime var close = serieData.GetCurrData(startDataIndex + 1, dataAddDuration, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); var lowest = serieData.GetCurrData(startDataIndex + 2, dataAddDuration, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); var heighest = serieData.GetCurrData(startDataIndex + 3, dataAddDuration, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); - var isRise = yAxis.inverse ? close open; + var isRise = yAxis.inverse ? close < open : close > open; var borderWidth = open == 0 ? 0f : (itemStyle.borderWidth == 0 ? theme.serie.candlestickBorderWidth : itemStyle.borderWidth); @@ -138,18 +138,30 @@ namespace XCharts.Runtime var minCut = (yMinValue > 0 ? yMinValue : 0); if (valueTotal != 0) { - barHig = (float) ((close - open) / valueTotal * grid.context.height); - pY += (float) ((open - minCut) / valueTotal * grid.context.height); + barHig = (float)((close - open) / valueTotal * grid.context.height); + pY += (float)((open - minCut) / valueTotal * grid.context.height); } serieData.context.stackHeight = barHig; float currHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, barHig); Vector3 plb, plt, prt, prb, top; - plb = new Vector3(pX + gap + borderWidth, pY + borderWidth); - plt = new Vector3(pX + gap + borderWidth, pY + currHig - borderWidth); - prt = new Vector3(pX + gap + barWidth - borderWidth, pY + currHig - borderWidth); - prb = new Vector3(pX + gap + barWidth - borderWidth, pY + borderWidth); - top = new Vector3(pX + gap + barWidth / 2, pY + currHig - borderWidth); + var offset = 2 * borderWidth; + if (isRise) + { + plb = new Vector3(pX + gap + offset, pY + offset); + plt = new Vector3(pX + gap + offset, pY + currHig - offset); + prt = new Vector3(pX + gap + barWidth - offset, pY + currHig - offset); + prb = new Vector3(pX + gap + barWidth - offset, pY + offset); + top = new Vector3(pX + gap + barWidth / 2, pY + currHig - offset); + } + else + { + plb = new Vector3(pX + gap + offset, pY - offset); + plt = new Vector3(pX + gap + offset, pY + currHig + offset); + prt = new Vector3(pX + gap + barWidth - offset, pY + currHig + offset); + prb = new Vector3(pX + gap + barWidth - offset, pY - offset); + top = new Vector3(pX + gap + barWidth / 2, pY + currHig + offset); + } if (serie.clip) { plb = chart.ClampInGrid(grid, plb); @@ -169,8 +181,8 @@ namespace XCharts.Runtime var itemWidth = Mathf.Abs(prt.x - plb.x); var itemHeight = Mathf.Abs(plt.y - prb.y); var center = new Vector3((plb.x + prt.x) / 2, (plt.y + prb.y) / 2); - var lowPos = new Vector3(center.x, zeroY + (float) ((lowest - minCut) / valueTotal * grid.context.height)); - var heighPos = new Vector3(center.x, zeroY + (float) ((heighest - minCut) / valueTotal * grid.context.height)); + var lowPos = new Vector3(center.x, zeroY + (float)((lowest - minCut) / valueTotal * grid.context.height)); + var heighPos = new Vector3(center.x, zeroY + (float)((heighest - minCut) / valueTotal * grid.context.height)); var openCenterPos = new Vector3(center.x, prb.y); var closeCenterPos = new Vector3(center.x, prt.y); if (intensive) diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs index 911f6eb2..918cd97b 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs @@ -17,16 +17,17 @@ namespace XCharts.Runtime public static Serie AddDefaultSerie(BaseChart chart, string serieName) { var serie = chart.AddSerie(serieName); - var lastValue = 50d; for (int i = 0; i < 50; i++) { - lastValue += UnityEngine.Random.Range(-10, 20); - var open = lastValue + Random.Range(-10, 5); - var close = lastValue + Random.Range(-5, 10); - var lowest = lastValue + Random.Range(-15, -10); - var heighest = lastValue + Random.Range(10, 20); + var open = lastValue; + var close = open + Random.Range(-20, 20); + var min = open < close ? open : close; + var max = open > close ? open : close; + var lowest = min + Random.Range(-10, -10); + var heighest = max + Random.Range(10, 10); chart.AddData(serie.index, i, open, close, lowest, heighest); + lastValue = close; } return serie; } diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs index 2fbf64f5..94e85c40 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs @@ -144,11 +144,23 @@ namespace XCharts.Runtime float currHig = AnimationStyleHelper.CheckDataAnimation(chart, serie, i, barHig); Vector3 plb, plt, prt, prb, top; - plb = new Vector3(pX + gap + borderWidth, pY + borderWidth); - plt = new Vector3(pX + gap + borderWidth, pY + currHig - borderWidth); - prt = new Vector3(pX + gap + barWidth - borderWidth, pY + currHig - borderWidth); - prb = new Vector3(pX + gap + barWidth - borderWidth, pY + borderWidth); - top = new Vector3(pX + gap + barWidth / 2, pY + currHig - borderWidth); + var offset = 2 * borderWidth; + if (isRise) + { + plb = new Vector3(pX + gap + offset, pY + offset); + plt = new Vector3(pX + gap + offset, pY + currHig - offset); + prt = new Vector3(pX + gap + barWidth - offset, pY + currHig - offset); + prb = new Vector3(pX + gap + barWidth - offset, pY + offset); + top = new Vector3(pX + gap + barWidth / 2, pY + currHig - offset); + } + else + { + plb = new Vector3(pX + gap + offset, pY - offset); + plt = new Vector3(pX + gap + offset, pY + currHig + offset); + prt = new Vector3(pX + gap + barWidth - offset, pY + currHig + offset); + prb = new Vector3(pX + gap + barWidth - offset, pY - offset); + top = new Vector3(pX + gap + barWidth / 2, pY + currHig + offset); + } // if (serie.clip) // { // plb = chart.ClampInGrid(grid, plb);