From a66b8a576c5e881c17548d8bbd22c818b403a7cb Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sun, 19 Apr 2020 23:17:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`LineChart`=E6=8A=98=E7=BA=BF?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E5=8C=BA=E5=9F=9F=E5=A1=AB=E5=85=85=E6=B8=90?= =?UTF-8?q?=E5=8F=98=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XCharts/CHANGELOG.md | 1 + Assets/XCharts/Runtime/Internal/CoordinateChart.cs | 12 ++++++++++++ .../Runtime/Internal/CoordinateChart_DrawLine.cs | 13 ++++++++++--- Assets/XCharts/Runtime/Utility/ChartDrawer.cs | 8 ++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md index 3c479c59..9f14c959 100644 --- a/Assets/XCharts/CHANGELOG.md +++ b/Assets/XCharts/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.04.19) 优化`LineChart`折线图的区域填充渐变效果 * (2020.04.19) 增加`AxisLabel`的`onZero`参数可将`Label`显示在`0`刻度上 * (2020.04.19) 增加`Serie`和`AxisLabel`的`showAsPositiveNumber`参数将负数数值显示为正数 * (2020.04.18) 增加`Covert XY Axis`互换XY轴配置 diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs index 40b7e8d8..a7a855b9 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs @@ -1813,6 +1813,18 @@ namespace XCharts p2 = ClampInChart(p2); ChartDrawer.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color); } + + protected Color GetXLerpColor(Color areaColor, Color areaToColor, Vector3 pos) + { + if (areaColor == areaToColor) return areaColor; + return Color.Lerp(areaToColor, areaColor, (pos.y - coordinateY) / coordinateHeight); + } + + protected Color GetYLerpColor(Color areaColor, Color areaToColor, Vector3 pos) + { + if (areaColor == areaToColor) return areaColor; + return Color.Lerp(areaToColor, areaColor, (pos.x - coordinateX) / coordinateWidth); + } } } diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs index 26a7c871..ad83e1ee 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -243,8 +243,6 @@ namespace XCharts break; case LineType.Smooth: case LineType.SmoothDash: - //llp = i > 1 ? serie.dataPoints[i - 2] : firstLastPos; - //nnp = i < serie.dataPoints.Count - 1 ? serie.dataPoints[i + 1] : lastNextPos; llp = GetLLPos(serie.dataPoints, i, firstLastPos); nnp = GetNNPos(serie.dataPoints, i, lastNextPos); isFinish = DrawSmoothLine(vh, serie, xAxis, lp, np, llp, nnp, i, @@ -253,7 +251,6 @@ namespace XCharts case LineType.StepStart: case LineType.StepMiddle: case LineType.StepEnd: - //nnp = i < serie.dataPoints.Count - 1 ? serie.dataPoints[i + 1] : np; nnp = GetNNPos(serie.dataPoints, i, np); isFinish = DrawStepLine(vh, serie, xAxis, lp, np, nnp, i, lineColor, areaColor, areaToColor, zeroPos); @@ -1006,6 +1003,7 @@ namespace XCharts { var isLessthan0 = (sp.x < zeroPos.x || ep.x < zeroPos.x); diff = isLessthan0 ? -axis.axisLine.width : axis.axisLine.width; + areaColor = GetYLerpColor(areaColor, areaToColor, sp); if (isLessthan0) areaDiff = -areaDiff; CheckClipAndDrawPolygon(vh, new Vector3(zeroPos.x + diff, sp.y), new Vector3(zeroPos.x + diff, ep.y), ep + areaDiff, sp + areaDiff, areaToColor, areaColor, clip); @@ -1014,6 +1012,7 @@ namespace XCharts { var isLessthan0 = (sp.y < zeroPos.y || ep.y < zeroPos.y); diff = isLessthan0 ? -axis.axisLine.width : axis.axisLine.width; + areaColor = GetXLerpColor(areaColor, areaToColor, sp); if (isLessthan0) areaDiff = -areaDiff; if (isLessthan0) { @@ -1118,6 +1117,7 @@ namespace XCharts smoothPoints.Add(startUp); smoothDownPoints.Add(startDn); } + var sourAreaColor = areaColor; for (int k = 1; k < bezierPoints.Count; k++) { to = bezierPoints[k]; @@ -1154,12 +1154,14 @@ namespace XCharts { tnp = new Vector3(zeroPos.x + xAxis.axisLine.width, toDn.y); tlp = new Vector3(zeroPos.x + xAxis.axisLine.width, startDn.y); + areaColor = GetYLerpColor(sourAreaColor, areaToColor, start); CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip); } else if (start.x < zeroPos.x && to.x < zeroPos.x) { tnp = new Vector3(zeroPos.x - xAxis.axisLine.width, toUp.y); tlp = new Vector3(zeroPos.x - xAxis.axisLine.width, startUp.y); + areaColor = GetYLerpColor(sourAreaColor, areaToColor, start); CheckClipAndDrawPolygon(vh, tnp, tlp, startUp, toUp, areaToColor, areaColor, serie.clip); } } @@ -1169,12 +1171,14 @@ namespace XCharts { tnp = new Vector3(toDn.x, zeroPos.y + xAxis.axisLine.width); tlp = new Vector3(startDn.x, zeroPos.y + xAxis.axisLine.width); + areaColor = GetXLerpColor(sourAreaColor, areaToColor, start); CheckClipAndDrawPolygon(vh, startDn, toDn, tnp, tlp, areaColor, areaToColor, serie.clip); } else if (start.y < zeroPos.y && to.y < zeroPos.y) { tnp = new Vector3(toUp.x, zeroPos.y - xAxis.axisLine.width); tlp = new Vector3(startUp.x, zeroPos.y - xAxis.axisLine.width); + areaColor = GetXLerpColor(sourAreaColor, areaToColor, start); CheckClipAndDrawPolygon(vh, tlp, tnp, toUp, startUp, areaToColor, areaColor, serie.clip); } } @@ -1206,11 +1210,14 @@ namespace XCharts var lastCount = 1; start = smoothPoints[0]; + var sourAreaColor = areaColor; for (int k = 1; k < smoothPoints.Count; k++) { to = smoothPoints[k]; if (serie.animation.CheckDetailBreak(to, isYAxis)) break; Vector3 tnp, tlp; + if (isYAxis) areaColor = GetYLerpColor(sourAreaColor, areaToColor, to); + else areaColor = GetXLerpColor(sourAreaColor, areaToColor, to); if (k == smoothPoints.Count - 1) { if (k < lastSmoothPoints.Count - 1) diff --git a/Assets/XCharts/Runtime/Utility/ChartDrawer.cs b/Assets/XCharts/Runtime/Utility/ChartDrawer.cs index 406532a7..46f35522 100644 --- a/Assets/XCharts/Runtime/Utility/ChartDrawer.cs +++ b/Assets/XCharts/Runtime/Utility/ChartDrawer.cs @@ -346,28 +346,28 @@ namespace XCharts if (brLt > 0) { roundLt = new Vector3(center.x - halfWid + brLt, center.y + halfHig - brLt); - DrawSector(vh, roundLt, brLt, color, color, 270, 360); + DrawSector(vh, roundLt, brLt, color, color, 270, 360, 1); ltIn = roundLt + brLt * Vector3.left; ltIn2 = roundLt + brLt * Vector3.up; } if (brRt > 0) { roundRt = new Vector3(center.x + halfWid - brRt, center.y + halfHig - brRt); - DrawSector(vh, roundRt, brRt, color, color, 0, 90); + DrawSector(vh, roundRt, brRt, color, color, 0, 90, 1); rtIn = roundRt + brRt * Vector3.up; rtIn2 = roundRt + brRt * Vector3.right; } if (brRb > 0) { roundRb = new Vector3(center.x + halfWid - brRb, center.y - halfHig + brRb); - DrawSector(vh, roundRb, brRb, color, color, 90, 180); + DrawSector(vh, roundRb, brRb, color, color, 90, 180, 1); rbIn = roundRb + brRb * Vector3.right; rbIn2 = roundRb + brRb * Vector3.down; } if (brLb > 0) { roundLb = new Vector3(center.x - halfWid + brLb, center.y - halfHig + brLb); - DrawSector(vh, roundLb, brLb, color, color, 180, 270); + DrawSector(vh, roundLb, brLb, color, color, 180, 270, 1); lbIn = roundLb + brLb * Vector3.left; lbIn2 = roundLb + brLb * Vector3.down; }