增加BarChart绘制渐变边框的支持

This commit is contained in:
monitor1394
2021-04-26 07:17:26 +08:00
parent 05f0002ef4
commit 20ea9e2620
10 changed files with 118 additions and 53 deletions

View File

@@ -34,6 +34,9 @@
## Latest
* (2021.04.26) Added support for `Barchart` to draw gradient borders
* (2021.04.23) Added support for custom charts
* (2021.04.22) Fixed bug where `Gauge` `axisLabel`'s text color could not be adjusted
* (2021.04.13) Add the `ShowStarttick` and '`ShowEndTick` parameters of 'AxisTick' to control whether the first and last ticks are displayed
* (2021.04.13) Improved multi-axis support #132

View File

@@ -34,6 +34,9 @@
## Latest
* (2021.04.26) 增加`BarChart`绘制渐变边框的支持
* (2021.04.23) 增加自定义图表支持
* (2021.04.22) 修复`Gauge``AxisLabel`和文字颜色无法调整的问题
* (2021.04.13) 增加`AxisTick``ShowStartTick``ShowEndTick`参数控制第一个和最后一个刻度是否显示
* (2021.04.13) 完善多坐标轴的支持 #132

View File

@@ -5,7 +5,6 @@
/* */
/************************************************/
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
@@ -33,6 +32,7 @@ namespace XCharts
PropertyField(prop, "m_BorderWidth");
PropertyField(prop, "m_BorderColor");
PropertyField(prop, "m_BorderColor0");
PropertyField(prop, "m_BorderToColor");
PropertyField(prop, "m_Opacity");
PropertyField(prop, "m_TooltipFormatter");
PropertyField(prop, "m_NumericFormatter");

View File

@@ -48,6 +48,7 @@ namespace XCharts
[SerializeField] private float m_BorderWidth = 0;
[SerializeField] private Color32 m_BorderColor;
[SerializeField] private Color32 m_BorderColor0;
[SerializeField] private Color32 m_BorderToColor;
[SerializeField] [Range(0, 1)] private float m_Opacity = 1;
[SerializeField] private string m_TooltipFormatter;
[SerializeField] private string m_NumericFormatter = "";
@@ -68,6 +69,7 @@ namespace XCharts
m_BorderWidth = 0;
m_BorderColor = Color.clear;
m_BorderColor0 = Color.clear;
m_BorderToColor = Color.clear;
m_Opacity = 1;
m_TooltipFormatter = null;
m_NumericFormatter = "";
@@ -181,6 +183,14 @@ namespace XCharts
set { if (PropertyUtil.SetColor(ref m_BorderColor0, value)) SetVerticesDirty(); }
}
/// <summary>
/// 边框的渐变色。
/// </summary>
public Color32 borderToColor
{
get { return m_BorderToColor; }
set { if (PropertyUtil.SetColor(ref m_BorderToColor, value)) SetVerticesDirty(); }
}
/// <summary>
/// 边框宽。
/// </summary>
public float borderWidth

View File

@@ -106,8 +106,8 @@ namespace XCharts
else
{
plt = new Vector3(pX + borderWidth, pY + space + barWidth - borderWidth);
prt = new Vector3(pX + currHig - borderWidth , pY + space + barWidth - borderWidth);
prb = new Vector3(pX + currHig - borderWidth , pY + space + borderWidth);
prt = new Vector3(pX + currHig - borderWidth, pY + space + barWidth - borderWidth);
prb = new Vector3(pX + currHig - borderWidth, pY + space + borderWidth);
plb = new Vector3(pX + borderWidth, pY + space + borderWidth);
}
top = new Vector3(pX + currHig - borderWidth, pY + space + barWidth / 2);
@@ -301,7 +301,6 @@ namespace XCharts
plt = ClampInGrid(grid, plt);
prt = ClampInGrid(grid, prt);
}
var borderColor = itemStyle.borderColor;
var itemWidth = Mathf.Abs(prb.x - plt.x);
var itemHeight = Mathf.Abs(prt.y - plb.y);
var center = new Vector3((plt.x + prb.x) / 2, (prt.y + plb.y) / 2);
@@ -316,8 +315,8 @@ namespace XCharts
{
CheckClipAndDrawPolygon(vh, plb, plt, prt, prb, areaColor, areaToColor, serie.clip, grid);
}
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, borderColor, 0,
itemStyle.cornerRadius, isYAxis);
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, itemStyle.borderColor,
itemStyle.borderToColor, 0, itemStyle.cornerRadius, isYAxis);
}
}
else
@@ -329,7 +328,6 @@ namespace XCharts
plt = ClampInGrid(grid, plt);
prt = ClampInGrid(grid, prt);
}
var borderColor = itemStyle.borderColor;
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);
@@ -345,8 +343,8 @@ namespace XCharts
CheckClipAndDrawPolygon(vh, ref prb, ref plb, ref plt, ref prt, areaColor, areaToColor,
serie.clip, grid);
}
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, borderColor, 0,
itemStyle.cornerRadius, isYAxis);
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, itemStyle.borderColor,
itemStyle.borderToColor, 0, itemStyle.cornerRadius, isYAxis);
}
}
}

View File

@@ -146,8 +146,8 @@ namespace XCharts
}
if (borderWidth != 0)
{
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, itemStyle.borderColor, 0,
itemStyle.cornerRadius, true, 0.5f);
UGL.DrawBorder(vh, center, itemWidth, itemHeight, borderWidth, itemStyle.borderColor,
itemStyle.borderToColor, 0, itemStyle.cornerRadius, true, 0.5f);
}
return new Rect(plb.x, plb.y, xEnd - xStart, barWidth);
}

View File

@@ -137,6 +137,8 @@ namespace XCharts
var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0;
var borderColor = serie.itemStyle.opacity > 0 ? serie.itemStyle.borderColor : ChartConst.clearColor32;
borderColor.a = (byte)(borderColor.a * serie.itemStyle.opacity);
var borderToColor = serie.itemStyle.opacity > 0 ? serie.itemStyle.borderToColor : ChartConst.clearColor32;
borderToColor.a = (byte)(borderToColor.a * serie.itemStyle.opacity);
serie.dataPoints.Clear();
serie.animation.InitProgress(1, 0, xCount);
var animationIndex = serie.animation.GetCurrIndex();
@@ -175,8 +177,8 @@ namespace XCharts
}
if (animationIndex >= 0 && i > animationIndex) continue;
serieData.canShowLabel = true;
var emphasis = (tooltip.show
&& i == (int)tooltip.runtimeXValues[0]
var emphasis = (tooltip.show
&& i == (int)tooltip.runtimeXValues[0]
&& j == (int)tooltip.runtimeYValues[0])
|| visualMap.runtimeSelectedIndex > 0;
var rectWid = xWidth - 2 * borderWidth;
@@ -184,15 +186,18 @@ namespace XCharts
UGL.DrawRectangle(vh, pos, rectWid / 2, rectHig / 2, color);
if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor))
{
UGL.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor);
UGL.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor, borderToColor);
}
if (visualMap.hoverLink && emphasis && serie.emphasis.show
if (visualMap.hoverLink && emphasis && serie.emphasis.show
&& serie.emphasis.itemStyle.borderWidth > 0)
{
var emphasisBorderWidth = serie.emphasis.itemStyle.borderWidth;
var emphasisBorderColor = serie.emphasis.itemStyle.opacity > 0
var emphasisBorderColor = serie.emphasis.itemStyle.opacity > 0
? serie.emphasis.itemStyle.borderColor : ChartConst.clearColor32;
UGL.DrawBorder(vh, pos, rectWid, rectHig, emphasisBorderWidth, emphasisBorderColor);
var emphasisBorderToColor = serie.emphasis.itemStyle.opacity > 0
? serie.emphasis.itemStyle.borderToColor : ChartConst.clearColor32;
UGL.DrawBorder(vh, pos, rectWid, rectHig, emphasisBorderWidth, emphasisBorderColor,
emphasisBorderToColor);
}
}
}

View File

@@ -1,9 +1,9 @@
/************************************************/
/* */
/* Copyright (c) 2018 - 2021 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/************************************************/
/******************************************/
/* */
/* Copyright (c) 2020 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/******************************************/
using System.Collections.Generic;
using UnityEngine;
@@ -477,7 +477,7 @@ namespace XUGL
vh.AddUIVertexQuad(s_Vertex);
}
private static void InitCornerRadius(float[] cornerRadius, float width, float height, bool isYAxis,
private static void InitCornerRadius(float[] cornerRadius, float width, float height, bool horizontal,
ref float brLt, ref float brRt, ref float brRb, ref float brLb, ref bool needRound)
{
if (cornerRadius == null) return;
@@ -498,7 +498,7 @@ namespace XUGL
if (brRt > 0 && brRt <= 1) brRt = brRt * min;
if (brRb > 0 && brRb <= 1) brRb = brRb * min;
if (brLb > 0 && brLb <= 1) brLb = brLb * min;
if (isYAxis)
if (horizontal)
{
if (brLb + brLt >= height)
{
@@ -807,8 +807,28 @@ namespace XUGL
/// <param name="rotate"></param>
/// <param name="cornerRadius"></param>
public static void DrawBorder(VertexHelper vh, Vector3 center, float rectWidth, float rectHeight,
float borderWidth, Color32 color, float rotate = 0, float[] cornerRadius = null, bool isYAxis = false,
float smoothness = 1f)
float borderWidth, Color32 color, float rotate = 0, float[] cornerRadius = null,
bool horizontal = false, float smoothness = 1f)
{
DrawBorder(vh, center, rectWidth, rectHeight, borderWidth, color, s_ClearColor32, rotate,
cornerRadius, horizontal, smoothness);
}
/// <summary>
/// 绘制(圆角)边框
/// </summary>
/// <param name="vh"></param>
/// <param name="center"></param>
/// <param name="rectWidth"></param>
/// <param name="rectHeight"></param>
/// <param name="borderWidth"></param>
/// <param name="color"></param>
/// <param name="toColor"></param>
/// <param name="rotate"></param>
/// <param name="cornerRadius"></param>
public static void DrawBorder(VertexHelper vh, Vector3 center, float rectWidth, float rectHeight,
float borderWidth, Color32 color, Color32 toColor, float rotate = 0, float[] cornerRadius = null,
bool horizontal = false, float smoothness = 1f)
{
if (borderWidth == 0 || UGLHelper.IsClearColor(color)) return;
var halfWid = rectWidth / 2;
@@ -823,9 +843,13 @@ namespace XUGL
var rbOt = new Vector3(center.x + halfWid + borderWidth, center.y - halfHig - borderWidth);
float brLt = 0, brRt = 0, brRb = 0, brLb = 0;
bool needRound = false;
InitCornerRadius(cornerRadius, rectWidth, rectHeight, isYAxis, ref brLt, ref brRt, ref brRb,
InitCornerRadius(cornerRadius, rectWidth, rectHeight, horizontal, ref brLt, ref brRt, ref brRb,
ref brLb, ref needRound);
var tempCenter = Vector3.zero;
if (UGLHelper.IsClearColor(toColor))
{
toColor = color;
}
if (needRound)
{
var lbIn2 = lbIn;
@@ -839,7 +863,8 @@ namespace XUGL
if (brLt > 0)
{
tempCenter = new Vector3(center.x - halfWid + brLt, center.y + halfHig - brLt);
DrawDoughnut(vh, tempCenter, brLt, brLt + borderWidth, color, s_ClearColor32, 270, 360, smoothness);
DrawDoughnut(vh, tempCenter, brLt, brLt + borderWidth, horizontal ? color : toColor, s_ClearColor32,
270, 360, smoothness);
ltIn = tempCenter + brLt * Vector3.left;
ltOt = tempCenter + (brLt + borderWidth) * Vector3.left;
ltIn2 = tempCenter + brLt * Vector3.up;
@@ -848,7 +873,7 @@ namespace XUGL
if (brRt > 0)
{
tempCenter = new Vector3(center.x + halfWid - brRt, center.y + halfHig - brRt);
DrawDoughnut(vh, tempCenter, brRt, brRt + borderWidth, color, s_ClearColor32, 0, 90, smoothness);
DrawDoughnut(vh, tempCenter, brRt, brRt + borderWidth, toColor, s_ClearColor32, 0, 90, smoothness);
rtIn = tempCenter + brRt * Vector3.up;
rtOt = tempCenter + (brRt + borderWidth) * Vector3.up;
rtIn2 = tempCenter + brRt * Vector3.right;
@@ -857,7 +882,8 @@ namespace XUGL
if (brRb > 0)
{
tempCenter = new Vector3(center.x + halfWid - brRb, center.y - halfHig + brRb);
DrawDoughnut(vh, tempCenter, brRb, brRb + borderWidth, color, s_ClearColor32, 90, 180, smoothness);
DrawDoughnut(vh, tempCenter, brRb, brRb + borderWidth, horizontal ? toColor : color, s_ClearColor32,
90, 180, smoothness);
rbIn = tempCenter + brRb * Vector3.right;
rbOt = tempCenter + (brRb + borderWidth) * Vector3.right;
rbIn2 = tempCenter + brRb * Vector3.down;
@@ -872,10 +898,20 @@ namespace XUGL
lbIn2 = tempCenter + brLb * Vector3.down;
lbOt2 = tempCenter + (brLb + borderWidth) * Vector3.down;
}
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color);
DrawQuadrilateral(vh, ltIn2, ltOt2, rtOt, rtIn, color);
DrawQuadrilateral(vh, rtIn2, rtOt2, rbOt, rbIn, color);
DrawQuadrilateral(vh, rbIn2, rbOt2, lbOt2, lbIn2, color);
if (horizontal)
{
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color, color);
DrawQuadrilateral(vh, ltIn2, ltOt2, rtOt, rtIn, color, toColor);
DrawQuadrilateral(vh, rtIn2, rtOt2, rbOt, rbIn, toColor, toColor);
DrawQuadrilateral(vh, rbIn2, rbOt2, lbOt2, lbIn2, toColor, color);
}
else
{
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color, toColor);
DrawQuadrilateral(vh, ltIn2, ltOt2, rtOt, rtIn, toColor, toColor);
DrawQuadrilateral(vh, rtIn2, rtOt2, rbOt, rbIn, toColor, color);
DrawQuadrilateral(vh, rbIn2, rbOt2, lbOt2, lbIn2, color, color);
}
}
else
{
@@ -890,10 +926,20 @@ namespace XUGL
rbIn = UGLHelper.RotateRound(rbIn, center, Vector3.forward, rotate);
rbOt = UGLHelper.RotateRound(rbOt, center, Vector3.forward, rotate);
}
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color);
DrawQuadrilateral(vh, ltIn, ltOt, rtOt, rtIn, color);
DrawQuadrilateral(vh, rtIn, rtOt, rbOt, rbIn, color);
DrawQuadrilateral(vh, rbIn, rbOt, lbOt, lbIn, color);
if (horizontal)
{
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color, color);
DrawQuadrilateral(vh, ltIn, ltOt, rtOt, rtIn, color, toColor);
DrawQuadrilateral(vh, rtIn, rtOt, rbOt, rbIn, toColor, toColor);
DrawQuadrilateral(vh, rbIn, rbOt, lbOt, lbIn, toColor, color);
}
else
{
DrawQuadrilateral(vh, lbIn, lbOt, ltOt, ltIn, color, toColor);
DrawQuadrilateral(vh, ltIn, ltOt, rtOt, rtIn, toColor, toColor);
DrawQuadrilateral(vh, rtIn, rtOt, rbOt, rbIn, toColor, color);
DrawQuadrilateral(vh, rbIn, rbOt, lbOt, lbIn, color, color);
}
}
}

View File

@@ -1,9 +1,9 @@
/************************************************/
/* */
/* Copyright (c) 2018 - 2021 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/************************************************/
/******************************************/
/* */
/* Copyright (c) 2020 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/******************************************/
using System.Collections.Generic;
using UnityEngine;
@@ -20,7 +20,7 @@ namespace XUGL
private Vector3 m_LeftTopPos = Vector3.zero;
private Color32 m_BackgroundColor = new Color32(224, 224, 224, 255);
private Color32 m_DrawColor = new Color32(255, 132, 142, 255);
private float[] m_BorderRadius = new float[] { 2, 2, 2, 2 };
private float[] m_BorderRadius = new float[] { 5, 5, 10, 10 };
protected override void Awake()
{
@@ -41,7 +41,7 @@ namespace XUGL
//背景边框
UGL.DrawSquare(vh, m_Center, m_Width / 2, m_BackgroundColor);
UGL.DrawBorder(vh, m_Center, m_Width, m_Height, 10, Color.green, 0, m_BorderRadius);
UGL.DrawBorder(vh, m_Center, m_Width, m_Height, 40, Color.green, Color.red, 0, m_BorderRadius,false,1);
//点
UGL.DrawCricle(vh, m_LeftTopPos + new Vector3(20, -20), 10, m_DrawColor);

View File

@@ -1,9 +1,9 @@
/************************************************/
/* */
/* Copyright (c) 2018 - 2021 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/************************************************/
/******************************************/
/* */
/* Copyright (c) 2020 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/******************************************/
using System.Collections.Generic;
using UnityEngine;