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);