diff --git a/CHANGELOG.md b/CHANGELOG.md index e039fbb2..1ae7307e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.03.09) 增加`BarChart`可通过`ItemStyle`配置边框的支持 * (2020.03.08) 增加`RingChart`环形图 * (2020.03.05) 调整`Serie`的`arcShaped`参数重命名为`roundCap` * (2020.03.05) 增加运行时和非运行时参数变更自动刷新图表 diff --git a/Documentation/XCharts配置项手册.md b/Documentation/XCharts配置项手册.md index 6f32171d..7f2f00e6 100644 --- a/Documentation/XCharts配置项手册.md +++ b/Documentation/XCharts配置项手册.md @@ -724,10 +724,12 @@ * `color`:颜色。 * `backgroundColor`:背景颜色。 * `backgroundWidth`:背景的宽。 +* `centerColor`:中心区域的颜色。如环形图的中心区域。 +* `centerGap`:中心区域的间隙。如环形图的中心区域于最内环的间隙。 * `borderType`:边框的类型。 * `borderColor`:边框的颜色。 * `borderWidth`:边框宽。 -* `borderWidth`:opacity。 +* `opacity`:透明度。 ## `LineArrow` diff --git a/Runtime/Component/Sub/ItemStyle.cs b/Runtime/Component/Sub/ItemStyle.cs index df234d3b..7385a468 100644 --- a/Runtime/Component/Sub/ItemStyle.cs +++ b/Runtime/Component/Sub/ItemStyle.cs @@ -125,5 +125,19 @@ namespace XCharts get { return m_Opacity; } set { if (PropertyUtility.SetStruct(ref m_Opacity, value)) SetVerticesDirty(); } } + /// + /// 实际边框宽。边框不显示时为0。 + /// + public float runtimeBorderWidth { get { return NeedShowBorder() ? borderWidth : 0; } } + + /// + /// 是否需要显示边框。 + /// + public bool NeedShowBorder() + { + return borderWidth != 0 && borderColor != Color.clear; + } + + } } \ No newline at end of file diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 94a46e62..a0316657 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -396,7 +396,7 @@ namespace XCharts count++; } } - SerieLabelHelper.UpdateLabelText(m_Series,m_ThemeInfo); + SerieLabelHelper.UpdateLabelText(m_Series, m_ThemeInfo); } private void InitSerieTitle() @@ -839,30 +839,8 @@ namespace XCharts if (serieLabel.border) { - var borderWid = serieLabel.borderWidth; - p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig + borderWid); - p2 = new Vector3(centerPos.x + labelHalfWid + 2 * borderWid, centerPos.y + labelHalfHig + borderWid); - p3 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y + labelHalfHig); - p4 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y - labelHalfHig - 2 * borderWid); - var p5 = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig - borderWid); - var p6 = new Vector3(centerPos.x - labelHalfWid - 2 * borderWid, centerPos.y - labelHalfHig - borderWid); - var p7 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y - labelHalfHig); - var p8 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y + labelHalfHig + 2 * borderWid); - if (serieLabel.rotate > 0) - { - p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serieLabel.rotate); - p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serieLabel.rotate); - p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serieLabel.rotate); - p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serieLabel.rotate); - p5 = ChartHelper.RotateRound(p5, centerPos, Vector3.forward, serieLabel.rotate); - p6 = ChartHelper.RotateRound(p6, centerPos, Vector3.forward, serieLabel.rotate); - p7 = ChartHelper.RotateRound(p7, centerPos, Vector3.forward, serieLabel.rotate); - p8 = ChartHelper.RotateRound(p8, centerPos, Vector3.forward, serieLabel.rotate); - } - ChartDrawer.DrawLine(vh, p1, p2, borderWid, serieLabel.borderColor); - ChartDrawer.DrawLine(vh, p3, p4, borderWid, serieLabel.borderColor); - ChartDrawer.DrawLine(vh, p5, p6, borderWid, serieLabel.borderColor); - ChartDrawer.DrawLine(vh, p7, p8, borderWid, serieLabel.borderColor); + ChartDrawer.DrawBorder(vh, centerPos, serieData.GetLabelWidth(), serieData.GetLabelHeight(), + serieLabel.borderWidth, serieLabel.borderColor, serieLabel.rotate); } } diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index f4370797..b2440016 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -1769,6 +1769,17 @@ namespace XCharts ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, startColor, toColor); } + protected void CheckClipAndDrawPolygon(VertexHelper vh, ref Vector3 p1, ref Vector3 p2, ref Vector3 p3, ref Vector3 p4, + Color32 startColor, Color32 toColor, bool clip) + { + p1 = ClampInCoordinate(p1); + p2 = ClampInCoordinate(p2); + p3 = ClampInCoordinate(p3); + p4 = ClampInCoordinate(p4); + if (!clip || (clip && (IsInCooridate(p1) && IsInCooridate(p2) && IsInCooridate(p3) && IsInCooridate(p4)))) + ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, startColor, toColor); + } + protected void CheckClipAndDrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color, bool clip) { diff --git a/Runtime/Internal/CoordinateChart_DrawBar.cs b/Runtime/Internal/CoordinateChart_DrawBar.cs index 4570b8ad..b03f4b6d 100644 --- a/Runtime/Internal/CoordinateChart_DrawBar.cs +++ b/Runtime/Internal/CoordinateChart_DrawBar.cs @@ -48,6 +48,7 @@ namespace XCharts float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); float xMinValue = xAxis.GetCurrMinValue(dataChangeDuration); float xMaxValue = xAxis.GetCurrMaxValue(dataChangeDuration); + float borderWidth = serie.itemStyle.runtimeBorderWidth; for (int i = serie.minShow; i < maxCount; i++) { if (i >= seriesHig.Count) @@ -81,11 +82,17 @@ namespace XCharts float currHig = CheckAnimation(serie, i, barHig); - Vector3 p1 = new Vector3(pX, pY + space + barWidth); - Vector3 p2 = new Vector3(pX + currHig, pY + space + barWidth); - Vector3 p3 = new Vector3(pX + currHig, pY + space); - Vector3 p4 = new Vector3(pX, pY + space); - serie.dataPoints.Add(new Vector3(pX + currHig, pY + space + barWidth / 2)); + Vector3 p1 = new Vector3(pX + borderWidth, pY + space + barWidth - borderWidth); + Vector3 p2 = new Vector3(pX + currHig - 2 * borderWidth, pY + space + barWidth - borderWidth); + Vector3 p3 = new Vector3(pX + currHig - 2 * borderWidth, pY + space + borderWidth); + Vector3 p4 = new Vector3(pX + borderWidth, pY + space + borderWidth); + Vector3 top = new Vector3(pX + currHig - borderWidth, pY + space + barWidth / 2); + p1 = ClampInCoordinate(p1); + p2 = ClampInCoordinate(p2); + p3 = ClampInCoordinate(p3); + p4 = ClampInCoordinate(p4); + top = ClampInCoordinate(top); + serie.dataPoints.Add(top); var highlight = (m_Tooltip.show && m_Tooltip.IsSelected(i)) || serie.data[i].highlighted || serie.highlighted; @@ -103,6 +110,14 @@ namespace XCharts else { CheckClipAndDrawPolygon(vh, p4, p1, p2, p3, areaColor, areaToColor, serie.clip); + if (borderWidth > 0) + { + var borderColor = serie.itemStyle.borderColor; + var itemWidth = Mathf.Abs(p3.x - p1.x); + var itemHeight = Mathf.Abs(p2.y - p4.y); + var center = new Vector3((p1.x + p3.x) / 2, (p2.y + p4.y) / 2); + ChartDrawer.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, borderColor); + } } } } @@ -118,7 +133,7 @@ namespace XCharts private float CheckAnimation(Serie serie, int dataIndex, float barHig) { - float currHig = serie.animation.CheckBarProgress(dataIndex,barHig); + float currHig = serie.animation.CheckBarProgress(dataIndex, barHig); if (!serie.animation.IsFinish()) { RefreshChart(); @@ -160,6 +175,7 @@ namespace XCharts float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); float yMinValue = yAxis.GetCurrMinValue(dataChangeDuration); float yMaxValue = yAxis.GetCurrMaxValue(dataChangeDuration); + float borderWidth = serie.itemStyle.runtimeBorderWidth; for (int i = serie.minShow; i < maxCount; i++) { if (i >= seriesHig.Count) @@ -191,16 +207,20 @@ namespace XCharts } float currHig = CheckAnimation(serie, i, barHig); - - Vector3 p1 = new Vector3(pX + space, pY); - Vector3 p2 = new Vector3(pX + space, pY + currHig); - Vector3 p3 = new Vector3(pX + space + barWidth, pY + currHig); - Vector3 p4 = new Vector3(pX + space + barWidth, pY); - serie.dataPoints.Add(new Vector3(pX + space + barWidth / 2, pY + currHig)); + Vector3 p1 = new Vector3(pX + space + borderWidth, pY + borderWidth); + Vector3 p2 = new Vector3(pX + space + borderWidth, pY + currHig - 2 * borderWidth); + Vector3 p3 = new Vector3(pX + space + barWidth, pY + currHig - 2 * borderWidth); + Vector3 p4 = new Vector3(pX + space + barWidth, pY + borderWidth); + Vector3 top = new Vector3(pX + space + barWidth / 2, pY + currHig - borderWidth); + p1 = ClampInCoordinate(p1); + p2 = ClampInCoordinate(p2); + p3 = ClampInCoordinate(p3); + p4 = ClampInCoordinate(p4); + top = ClampInCoordinate(top); + serie.dataPoints.Add(top); var highlight = (m_Tooltip.show && m_Tooltip.IsSelected(i)) || serie.data[i].highlighted || serie.highlighted; - if (serie.show) { Color areaColor = serie.GetAreaColor(m_ThemeInfo, colorIndex, highlight); @@ -214,7 +234,15 @@ namespace XCharts } else { - CheckClipAndDrawPolygon(vh, p4, p1, p2, p3, areaColor, areaToColor, serie.clip); + CheckClipAndDrawPolygon(vh, ref p4, ref p1, ref p2, ref p3, areaColor, areaToColor, serie.clip); + if (borderWidth > 0) + { + var borderColor = serie.itemStyle.borderColor; + var itemWidth = Mathf.Abs(p3.x - p1.x); + var itemHeight = Mathf.Abs(p2.y - p4.y); + var center = new Vector3((p1.x + p3.x) / 2, (p2.y + p4.y) / 2); + ChartDrawer.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, borderColor); + } } } } diff --git a/Runtime/Utility/ChartDrawer.cs b/Runtime/Utility/ChartDrawer.cs index 3c7f1e3f..e523933d 100644 --- a/Runtime/Utility/ChartDrawer.cs +++ b/Runtime/Utility/ChartDrawer.cs @@ -248,19 +248,30 @@ namespace XCharts vh.AddUIVertexQuad(vertex); } - public static void DrawBorder(VertexHelper vh, Vector3 p, float rectWidth, float rectHeight, - float borderWidth, Color32 color) + public static void DrawBorder(VertexHelper vh, Vector3 center, float rectWidth, float rectHeight, + float borderWidth, Color32 color, float rotate = 0) { var halfWid = rectWidth / 2; var halfHig = rectHeight / 2; - var p1In = new Vector3(p.x - halfWid, p.y - halfHig); - var p1Ot = new Vector3(p.x - halfWid - borderWidth, p.y - halfHig - borderWidth); - var p2In = new Vector3(p.x - halfWid, p.y + halfHig); - var p2Ot = new Vector3(p.x - halfWid - borderWidth, p.y + halfHig + borderWidth); - var p3In = new Vector3(p.x + halfWid, p.y + halfHig); - var p3Ot = new Vector3(p.x + halfWid + borderWidth, p.y + halfHig + borderWidth); - var p4In = new Vector3(p.x + halfWid, p.y - halfHig); - var p4Ot = new Vector3(p.x + halfWid + borderWidth, p.y - halfHig - borderWidth); + var p1In = new Vector3(center.x - halfWid, center.y - halfHig); + var p1Ot = new Vector3(center.x - halfWid - borderWidth, center.y - halfHig - borderWidth); + var p2In = new Vector3(center.x - halfWid, center.y + halfHig); + var p2Ot = new Vector3(center.x - halfWid - borderWidth, center.y + halfHig + borderWidth); + var p3In = new Vector3(center.x + halfWid, center.y + halfHig); + var p3Ot = new Vector3(center.x + halfWid + borderWidth, center.y + halfHig + borderWidth); + var p4In = new Vector3(center.x + halfWid, center.y - halfHig); + var p4Ot = new Vector3(center.x + halfWid + borderWidth, center.y - halfHig - borderWidth); + if (rotate > 0) + { + p1In = ChartHelper.RotateRound(p1In, center, Vector3.forward, rotate); + p1Ot = ChartHelper.RotateRound(p1Ot, center, Vector3.forward, rotate); + p2In = ChartHelper.RotateRound(p2In, center, Vector3.forward, rotate); + p2Ot = ChartHelper.RotateRound(p2Ot, center, Vector3.forward, rotate); + p3In = ChartHelper.RotateRound(p3In, center, Vector3.forward, rotate); + p3Ot = ChartHelper.RotateRound(p3Ot, center, Vector3.forward, rotate); + p4In = ChartHelper.RotateRound(p4In, center, Vector3.forward, rotate); + p4Ot = ChartHelper.RotateRound(p4Ot, center, Vector3.forward, rotate); + } DrawPolygon(vh, p1In, p1Ot, p2Ot, p2In, color); DrawPolygon(vh, p2In, p2Ot, p3Ot, p3In, color); DrawPolygon(vh, p3In, p3Ot, p4Ot, p4In, color);