完善BarChartZebra斑马柱图渐变支持

This commit is contained in:
monitor1394
2021-07-29 08:05:54 +08:00
parent 8f6f5790b6
commit f85f96a560
7 changed files with 35 additions and 26 deletions

View File

@@ -39,6 +39,7 @@
## master ## master
* (2021.07.29) Improved `BarChart`'s `Zebra` gradient support
* (2021.07.26) Fixed issue where `XCharts` path could not be found when `TextMeshPro Enable` (#160) * (2021.07.26) Fixed issue where `XCharts` path could not be found when `TextMeshPro Enable` (#160)
## v2.3.0 ## v2.3.0

View File

@@ -39,6 +39,7 @@
## master ## master
* (2021.07.29) 完善`BarChart``Zebra`斑马柱图渐变支持
* (2021.07.26) 修复`TextMeshPro Enable`时找不到`XCharts`路径的问题 (#160) * (2021.07.26) 修复`TextMeshPro Enable`时找不到`XCharts`路径的问题 (#160)
## v2.3.0 ## v2.3.0

View File

@@ -1689,11 +1689,11 @@ namespace XCharts
} }
public void Internal_CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, float zebraWidth, public void Internal_CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, float zebraWidth,
float zebraGap, Color32 color, bool clip, Grid grid) float zebraGap, Color32 color,Color32 toColor, bool clip, Grid grid)
{ {
ClampInChart(ref p1); ClampInChart(ref p1);
ClampInChart(ref p2); ClampInChart(ref p2);
UGL.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color); UGL.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color, toColor);
} }
protected Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid grid) protected Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, Grid grid)

View File

@@ -376,21 +376,22 @@ namespace XCharts
bool highlight, float space, float barWidth, float pX, float pY, Vector3 plb, Vector3 plt, Vector3 prt, bool highlight, float space, float barWidth, float pX, float pY, Vector3 plb, Vector3 plt, Vector3 prt,
Vector3 prb, bool isYAxis, Grid grid) Vector3 prb, bool isYAxis, Grid grid)
{ {
var areaColor = SerieHelper.GetItemColor(serie, serieData, m_Theme, colorIndex, highlight); var barColor = SerieHelper.GetItemColor(serie, serieData, m_Theme, colorIndex, highlight);
var barToColor = SerieHelper.GetItemToColor(serie, serieData, m_Theme, colorIndex, highlight);
DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid); DrawBarBackground(vh, serie, serieData, itemStyle, colorIndex, highlight, pX, pY, space, barWidth, isYAxis, grid);
if (isYAxis) if (isYAxis)
{ {
plt = (plb + plt) / 2; plt = (plb + plt) / 2;
prt = (prt + prb) / 2; prt = (prt + prb) / 2;
Internal_CheckClipAndDrawZebraLine(vh, plt, prt, barWidth / 2, serie.barZebraWidth, serie.barZebraGap, Internal_CheckClipAndDrawZebraLine(vh, plt, prt, barWidth / 2, serie.barZebraWidth, serie.barZebraGap,
areaColor, serie.clip, grid); barColor, barToColor, serie.clip, grid);
} }
else else
{ {
plb = (prb + plb) / 2; plb = (prb + plb) / 2;
plt = (plt + prt) / 2; plt = (plt + prt) / 2;
Internal_CheckClipAndDrawZebraLine(vh, plb, plt, barWidth / 2, serie.barZebraWidth, serie.barZebraGap, Internal_CheckClipAndDrawZebraLine(vh, plb, plt, barWidth / 2, serie.barZebraWidth, serie.barZebraGap,
areaColor, serie.clip, grid); barColor, barToColor, serie.clip, grid);
} }
} }

View File

@@ -635,11 +635,11 @@ namespace XCharts
areaColor, areaToColor, zeroPos); areaColor, areaToColor, zeroPos);
break; break;
case LineType.Dash: case LineType.Dash:
UGL.DrawDashLine(vh, lp, np, serie.lineStyle.GetWidth(m_Theme.serie.lineWidth), lineColor); UGL.DrawDashLine(vh, lp, np, serie.lineStyle.GetWidth(m_Theme.serie.lineWidth), lineColor, lineColor);
isFinish = true; isFinish = true;
break; break;
case LineType.Dot: case LineType.Dot:
UGL.DrawDotLine(vh, lp, np, serie.lineStyle.GetWidth(m_Theme.serie.lineWidth), lineColor); UGL.DrawDotLine(vh, lp, np, serie.lineStyle.GetWidth(m_Theme.serie.lineWidth), lineColor, lineColor);
isFinish = true; isFinish = true;
break; break;
case LineType.DashDot: case LineType.DashDot:
@@ -1172,10 +1172,10 @@ namespace XCharts
switch (serie.lineType) switch (serie.lineType)
{ {
case LineType.Dash: case LineType.Dash:
UGL.DrawDashLine(vh, lp, np, lineWidth, lineColor, 0, 0, posList); UGL.DrawDashLine(vh, lp, np, lineWidth, lineColor, lineColor, 0, 0, posList);
break; break;
case LineType.Dot: case LineType.Dot:
UGL.DrawDotLine(vh, lp, np, lineWidth, lineColor, 0, 0, posList); UGL.DrawDotLine(vh, lp, np, lineWidth, lineColor, lineColor, 0, 0, posList);
break; break;
case LineType.DashDot: case LineType.DashDot:
UGL.DrawDashDotLine(vh, lp, np, lineWidth, lineColor, 0, 0, 0, posList); UGL.DrawDashDotLine(vh, lp, np, lineWidth, lineColor, 0, 0, 0, posList);

View File

@@ -104,10 +104,10 @@ namespace XCharts
switch (lineType) switch (lineType)
{ {
case LineStyle.Type.Dashed: case LineStyle.Type.Dashed:
UGL.DrawDashLine(vh, startPos, endPos, lineWidth, color); UGL.DrawDashLine(vh, startPos, endPos, lineWidth, color, color);
break; break;
case LineStyle.Type.Dotted: case LineStyle.Type.Dotted:
UGL.DrawDotLine(vh, startPos, endPos, lineWidth, color); UGL.DrawDotLine(vh, startPos, endPos, lineWidth, color, color);
break; break;
case LineStyle.Type.Solid: case LineStyle.Type.Solid:
UGL.DrawLine(vh, startPos, endPos, lineWidth, color); UGL.DrawLine(vh, startPos, endPos, lineWidth, color);

View File

@@ -119,12 +119,13 @@ namespace XUGL
/// <param name="startPoint">起始点</param> /// <param name="startPoint">起始点</param>
/// <param name="endPoint">结束点</param> /// <param name="endPoint">结束点</param>
/// <param name="width">线宽</param> /// <param name="width">线宽</param>
/// <param name="color">颜色</param> /// <param name="color">起始颜色</param>
/// <param name="toColor">结束颜色</param>
/// <param name="lineLength">实线部分长度默认为线宽的12倍</param> /// <param name="lineLength">实线部分长度默认为线宽的12倍</param>
/// <param name="gapLength">间隙部分长度默认为线宽的3倍</param> /// <param name="gapLength">间隙部分长度默认为线宽的3倍</param>
/// <param name="posList">可选,输出的关键点</param> /// <param name="posList">可选,输出的关键点</param>
public static void DrawDashLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, public static void DrawDashLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width,
Color32 color, float lineLength = 0f, float gapLength = 0f, List<Vector3> posList = null) Color32 color, Color32 toColor, float lineLength = 0f, float gapLength = 0f, List<Vector3> posList = null)
{ {
float dist = Vector3.Distance(startPoint, endPoint); float dist = Vector3.Distance(startPoint, endPoint);
if (dist < 0.1f) return; if (dist < 0.1f) return;
@@ -133,17 +134,18 @@ namespace XUGL
int segment = Mathf.CeilToInt(dist / (lineLength + gapLength)); int segment = Mathf.CeilToInt(dist / (lineLength + gapLength));
Vector3 dir = (endPoint - startPoint).normalized; Vector3 dir = (endPoint - startPoint).normalized;
Vector3 sp = startPoint, np; Vector3 sp = startPoint, np;
var isGradient = !color.Equals(toColor);
if (posList != null) posList.Clear(); if (posList != null) posList.Clear();
for (int i = 1; i <= segment; i++) for (int i = 1; i <= segment; i++)
{ {
if (posList != null) posList.Add(sp); if (posList != null) posList.Add(sp);
np = startPoint + dir * dist * i / segment; np = startPoint + dir * dist * i / segment;
var dashep = np - dir * gapLength; var dashep = np - dir * gapLength;
DrawLine(vh, sp, dashep, width, color); DrawLine(vh, sp, dashep, width, isGradient ? Color32.Lerp(color, toColor, i * 1.0f / segment) : color);
sp = np; sp = np;
} }
if (posList != null) posList.Add(endPoint); if (posList != null) posList.Add(endPoint);
DrawLine(vh, sp, endPoint, width, color); DrawLine(vh, sp, endPoint, width, toColor);
} }
/// <summary> /// <summary>
@@ -153,31 +155,34 @@ namespace XUGL
/// <param name="startPoint">起始点</param> /// <param name="startPoint">起始点</param>
/// <param name="endPoint">结束点</param> /// <param name="endPoint">结束点</param>
/// <param name="width">线宽</param> /// <param name="width">线宽</param>
/// <param name="color">颜色</param> /// <param name="color">起始颜色</param>
/// <param name="toColor">结束颜色</param>
/// <param name="lineLength">实线部分长度默认为线宽的3倍</param> /// <param name="lineLength">实线部分长度默认为线宽的3倍</param>
/// <param name="gapLength">间隙部分长度默认为线宽的3倍</param> /// <param name="gapLength">间隙部分长度默认为线宽的3倍</param>
/// <param name="posList">可选,输出的关键点</param> /// <param name="posList">可选,输出的关键点</param>
public static void DrawDotLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, public static void DrawDotLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width,
Color32 color, float lineLength = 0f, float gapLength = 0f, List<Vector3> posList = null) Color32 color, Color32 toColor, float lineLength = 0f, float gapLength = 0f, List<Vector3> posList = null)
{ {
float dist = Vector3.Distance(startPoint, endPoint); var dist = Vector3.Distance(startPoint, endPoint);
if (dist < 0.1f) return; if (dist < 0.1f) return;
if (lineLength == 0) lineLength = 3 * width; if (lineLength == 0) lineLength = 3 * width;
if (gapLength == 0) gapLength = 3 * width; if (gapLength == 0) gapLength = 3 * width;
int segment = Mathf.CeilToInt(dist / (lineLength + gapLength)); var segment = Mathf.CeilToInt(dist / (lineLength + gapLength));
Vector3 dir = (endPoint - startPoint).normalized; var dir = (endPoint - startPoint).normalized;
Vector3 sp = startPoint, np; var sp = startPoint;
var np = Vector3.zero;
var isGradient = !color.Equals(toColor);
if (posList != null) posList.Clear(); if (posList != null) posList.Clear();
for (int i = 1; i <= segment; i++) for (int i = 1; i <= segment; i++)
{ {
if (posList != null) posList.Add(sp); if (posList != null) posList.Add(sp);
np = startPoint + dir * dist * i / segment; np = startPoint + dir * dist * i / segment;
var dashep = np - dir * gapLength; var dashep = np - dir * gapLength;
DrawLine(vh, sp, dashep, width, color); DrawLine(vh, sp, dashep, width, isGradient ? Color32.Lerp(color, toColor, i * 1.0f / segment) : color);
sp = np; sp = np;
} }
if (posList != null) posList.Add(endPoint); if (posList != null) posList.Add(endPoint);
DrawLine(vh, sp, endPoint, width, color); DrawLine(vh, sp, endPoint, width, toColor);
} }
/// <summary> /// <summary>
@@ -277,11 +282,12 @@ namespace XUGL
/// <param name="width">线宽</param> /// <param name="width">线宽</param>
/// <param name="zebraWidth">斑马条纹宽</param> /// <param name="zebraWidth">斑马条纹宽</param>
/// <param name="zebraGap">间隙宽</param> /// <param name="zebraGap">间隙宽</param>
/// <param name="color">颜色</param> /// <param name="color">起始颜色</param>
/// <param name="toColor">结束颜色</param>
public static void DrawZebraLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, public static void DrawZebraLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width,
float zebraWidth, float zebraGap, Color32 color) float zebraWidth, float zebraGap, Color32 color, Color32 toColor)
{ {
DrawDotLine(vh, startPoint, endPoint, width, color, zebraWidth, zebraGap); DrawDotLine(vh, startPoint, endPoint, width, color, toColor, zebraWidth, zebraGap);
} }
/// <summary> /// <summary>