diff --git a/CHANGELOG.md b/CHANGELOG.md index bed08747..4d4eadcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,9 @@ ## master +* (2022.07.19) 增加`Axis`的`MinorSplitLine`设置坐标轴次分割线 +* (2022.07.19) 增加`Axis`的`MinorTick`设置坐标轴次刻度 +* (2022.07.17) 增加`Radar`的`smooth`参数设置平滑曲线 * (2022.07.15) 增加`DataZoom`对`Time`时间轴的支持 ## 3.1.0 diff --git a/Documentation/XChartsAPI-EN.md b/Documentation/XChartsAPI-EN.md index 0b26bdc4..ea59ea32 100644 --- a/Documentation/XChartsAPI-EN.md +++ b/Documentation/XChartsAPI-EN.md @@ -130,11 +130,14 @@ Inherits or Implemented: [MainComponentHandler](#MainComponentHandler) | `GetAxisValueDistance()` |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上相对起点的距离 | | `GetAxisValueLength()` |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上对应的长度 | | `GetAxisValuePosition()` |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上的坐标位置 | +| `GetAxisXOrY()` |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)
| | `GetDataWidth()` |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)
获得一个类目数据在坐标系中代表的宽度 | | `GetEachWidth()` |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)
| | `GetScaleNumber()` |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)
获得分割线条数 | | `GetScaleWidth()` |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)
获得分割段宽度 | | `GetSplitNumber()` |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)
获得分割段数 | +| `GetXAxisXOrY()` |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)
| +| `GetYAxisXOrY()` |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)
| | `NeedShowSplit()` |public static bool NeedShowSplit(Axis axis)
| ## `BarChart` diff --git a/Documentation/XChartsAPI-ZH.md b/Documentation/XChartsAPI-ZH.md index bfba19fd..9d8218e4 100644 --- a/Documentation/XChartsAPI-ZH.md +++ b/Documentation/XChartsAPI-ZH.md @@ -130,11 +130,14 @@ Inherits or Implemented: [MainComponentHandler](#MainComponentHandler) | `GetAxisValueDistance()` |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上相对起点的距离 | | `GetAxisValueLength()` |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上对应的长度 | | `GetAxisValuePosition()` |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)
获得数值value在坐标轴上的坐标位置 | +| `GetAxisXOrY()` |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)
| | `GetDataWidth()` |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)
获得一个类目数据在坐标系中代表的宽度 | | `GetEachWidth()` |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)
| | `GetScaleNumber()` |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)
获得分割线条数 | | `GetScaleWidth()` |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)
获得分割段宽度 | | `GetSplitNumber()` |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)
获得分割段数 | +| `GetXAxisXOrY()` |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)
| +| `GetYAxisXOrY()` |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)
| | `NeedShowSplit()` |public static bool NeedShowSplit(Axis axis)
| ## `BarChart` diff --git a/Documentation/XChartsConfiguration-EN.md b/Documentation/XChartsConfiguration-EN.md index f1cdde1e..6af10094 100644 --- a/Documentation/XChartsConfiguration-EN.md +++ b/Documentation/XChartsConfiguration-EN.md @@ -76,6 +76,8 @@ - [ArrowStyle](#ArrowStyle) - [AxisLabel](#AxisLabel) - [AxisLine](#AxisLine) +- [AxisMinorSplitLine](#AxisMinorSplitLine) +- [AxisMinorTick](#AxisMinorTick) - [AxisName](#AxisName) - [AxisSplitArea](#AxisSplitArea) - [AxisSplitLine](#AxisSplitLine) @@ -263,8 +265,10 @@ The axis in rectangular coordinate. |`axisLine`|||axis Line. [AxisLine](#AxisLine)| |`axisName`|||axis name. [AxisName](#AxisName)| |`axisTick`|||axis tick. [AxisTick](#AxisTick)| +|`minorTick`|||axis minor tick. [AxisMinorTick](#AxisMinorTick)| |`axisLabel`|||axis label. [AxisLabel](#AxisLabel)| |`splitLine`|||axis split line. [AxisSplitLine](#AxisSplitLine)| +|`minorSplitLine`|||axis minor split line. [AxisMinorSplitLine](#AxisMinorSplitLine)| |`splitArea`|||axis split area. [AxisSplitArea](#AxisSplitArea)| ## `AxisLabel` @@ -295,6 +299,28 @@ Settings related to axis line. |`showArrow`|||Whether to show the arrow symbol of axis. |`arrow`|||the arrow of line. [ArrowStyle](#ArrowStyle)| +## `AxisMinorSplitLine` + +Inherits or Implemented: [BaseLine](#BaseLine) + +Minor split line of axis in grid area. + +|field|default|since|comment| +|--|--|--|--| +|`distance`|||The distance between the split line and axis line. +|`autoColor`|||auto color. + +## `AxisMinorTick` + +Inherits or Implemented: [BaseLine](#BaseLine) + +Settings related to axis minor tick. + +|field|default|since|comment| +|--|--|--|--| +|`splitNumber`|5||Number of segments that the axis is split into. +|`autoColor`||| + ## `AxisName` Inherits or Implemented: [ChildComponent](#ChildComponent) @@ -384,7 +410,8 @@ Inherits or Implemented: [ComponentTheme](#ComponentTheme) |`splitLineType`|||the type of split line.
`LineStyle.Type`:
- `Solid`: 实线
- `Dashed`: 虚线
- `Dotted`: 点线
- `DashDot`: 点划线
- `DashDotDot`: 双点划线
- `None`: 双点划线
| |`splitLineWidth`|1f||the width of split line. |`splitLineLength`|0f||the length of split line. -|`splitLineColor`|||the color of line. +|`splitLineColor`|||the color of split line. +|`minorSplitLineColor`|||the color of minor split line. |`tickWidth`|1f||the width of tick. |`tickLength`|5f||the length of tick. |`tickColor`|||the color of tick. @@ -994,6 +1021,9 @@ Polar coordinate can be used in scatter and line chart. Every polar coordinate h Inherits or Implemented: [Serie](#Serie),[INeedSerieContainer](#INeedSerieContainer) +|field|default|since|comment| +|--|--|--|--| +|`smooth`|false|3.2.0|Whether use smooth curve. ## `RadarAxisTheme` diff --git a/Documentation/XChartsConfiguration-ZH.md b/Documentation/XChartsConfiguration-ZH.md index 78aad72c..42e46a7e 100644 --- a/Documentation/XChartsConfiguration-ZH.md +++ b/Documentation/XChartsConfiguration-ZH.md @@ -76,6 +76,8 @@ - [ArrowStyle](#ArrowStyle) - [AxisLabel](#AxisLabel) - [AxisLine](#AxisLine) +- [AxisMinorSplitLine](#AxisMinorSplitLine) +- [AxisMinorTick](#AxisMinorTick) - [AxisName](#AxisName) - [AxisSplitArea](#AxisSplitArea) - [AxisSplitLine](#AxisSplitLine) @@ -263,8 +265,10 @@ Inherits or Implemented: [MainComponent](#MainComponent) |`axisLine`|||坐标轴轴线。 [AxisLine](#AxisLine)| |`axisName`|||坐标轴名称。 [AxisName](#AxisName)| |`axisTick`|||坐标轴刻度。 [AxisTick](#AxisTick)| +|`minorTick`|||坐标轴次刻度。 [AxisMinorTick](#AxisMinorTick)| |`axisLabel`|||坐标轴刻度标签。 [AxisLabel](#AxisLabel)| |`splitLine`|||坐标轴分割线。 [AxisSplitLine](#AxisSplitLine)| +|`minorSplitLine`|||坐标轴次分割线。 [AxisMinorSplitLine](#AxisMinorSplitLine)| |`splitArea`|||坐标轴分割区域。 [AxisSplitArea](#AxisSplitArea)| ## `AxisLabel` @@ -295,6 +299,28 @@ Inherits or Implemented: [BaseLine](#BaseLine) |`showArrow`|||是否显示箭头。 |`arrow`|||轴线箭头。 [ArrowStyle](#ArrowStyle)| +## `AxisMinorSplitLine` + +Inherits or Implemented: [BaseLine](#BaseLine) + +坐标轴在 grid 区域中的次分隔线。次分割线会对齐次刻度线 minorTick。 + +|field|default|since|comment| +|--|--|--|--| +|`distance`|||刻度线与轴线的距离。 +|`autoColor`|||自动设置颜色。 + +## `AxisMinorTick` + +Inherits or Implemented: [BaseLine](#BaseLine) + +坐标轴次刻度相关设置。注意:次刻度无法再类目轴中使用。 + +|field|default|since|comment| +|--|--|--|--| +|`splitNumber`|5||分隔线之间分割的刻度数。 +|`autoColor`||| + ## `AxisName` Inherits or Implemented: [ChildComponent](#ChildComponent) @@ -385,6 +411,7 @@ Inherits or Implemented: [ComponentTheme](#ComponentTheme) |`splitLineWidth`|1f||分割线线宽。 |`splitLineLength`|0f||分割线线长。 |`splitLineColor`|||分割线线颜色。 +|`minorSplitLineColor`|||次分割线线颜色。 |`tickWidth`|1f||刻度线线宽。 |`tickLength`|5f||刻度线线长。 |`tickColor`|||坐标轴线颜色。 @@ -994,6 +1021,9 @@ Inherits or Implemented: [CoordSystem](#CoordSystem),[ISerieContainer](#ISerieCo Inherits or Implemented: [Serie](#Serie),[INeedSerieContainer](#INeedSerieContainer) +|field|default|since|comment| +|--|--|--|--| +|`smooth`|false|3.2.0|是否平滑曲线。平滑曲线时不支持区域填充颜色。 ## `RadarAxisTheme` diff --git a/Editor/ChildComponents/LineDrawer.cs b/Editor/ChildComponents/LineDrawer.cs index b3d4896d..002d520c 100644 --- a/Editor/ChildComponents/LineDrawer.cs +++ b/Editor/ChildComponents/LineDrawer.cs @@ -47,6 +47,18 @@ namespace XCharts.Editor } } + [CustomPropertyDrawer(typeof(AxisMinorSplitLine), true)] + public class AxisMinorSplitLineDrawer : BaseLineDrawer + { + public override string ClassName { get { return "MinorSplitLine"; } } + protected override void DrawExtendeds(SerializedProperty prop) + { + base.DrawExtendeds(prop); + //PropertyField(prop, "m_Distance"); + //PropertyField(prop, "m_AutoColor"); + } + } + [CustomPropertyDrawer(typeof(AxisTick), true)] public class AxisTickDrawer : BaseLineDrawer { @@ -63,4 +75,16 @@ namespace XCharts.Editor PropertyField(prop, "m_AutoColor"); } } + + [CustomPropertyDrawer(typeof(AxisMinorTick), true)] + public class AxisMinorTickDrawer : BaseLineDrawer + { + public override string ClassName { get { return "MinorTick"; } } + protected override void DrawExtendeds(SerializedProperty prop) + { + base.DrawExtendeds(prop); + PropertyField(prop, "m_SplitNumber"); + //PropertyField(prop, "m_AutoColor"); + } + } } \ No newline at end of file diff --git a/Editor/MainComponents/AxisEditor.cs b/Editor/MainComponents/AxisEditor.cs index 47868ac1..46e1bac4 100644 --- a/Editor/MainComponents/AxisEditor.cs +++ b/Editor/MainComponents/AxisEditor.cs @@ -70,7 +70,6 @@ namespace XCharts.Editor else { PropertyField("m_Interval"); - PropertyField("m_BoundaryGap"); } DrawExtendeds(); PropertyField("m_AxisLine"); @@ -79,6 +78,11 @@ namespace XCharts.Editor PropertyField("m_AxisLabel"); PropertyField("m_SplitLine"); PropertyField("m_SplitArea"); + if (type != Axis.AxisType.Category) + { + PropertyField("m_MinorTick"); + PropertyField("m_MinorSplitLine"); + } PropertyListField("m_Icons", true); if (type == Axis.AxisType.Category) { @@ -93,12 +97,10 @@ namespace XCharts.Editor } [ComponentEditor(typeof(XAxis))] - public class XAxisEditor : AxisEditor - { } + public class XAxisEditor : AxisEditor { } [ComponentEditor(typeof(YAxis))] - public class YAxisEditor : AxisEditor - { } + public class YAxisEditor : AxisEditor { } [ComponentEditor(typeof(SingleAxis))] public class SingleAxisEditor : AxisEditor @@ -128,12 +130,10 @@ namespace XCharts.Editor } [ComponentEditor(typeof(RadiusAxis))] - public class RadiusAxisEditor : AxisEditor - { } + public class RadiusAxisEditor : AxisEditor { } [ComponentEditor(typeof(ParallelAxis))] - public class ParallelAxisEditor : AxisEditor - { } + public class ParallelAxisEditor : AxisEditor { } [CustomPropertyDrawer(typeof(AxisLabel), true)] public class AxisLabelDrawer : BasePropertyDrawer diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index b51f9461..fe42a520 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -98,8 +98,10 @@ namespace XCharts.Runtime [SerializeField] protected AxisLine m_AxisLine = AxisLine.defaultAxisLine; [SerializeField] protected AxisName m_AxisName = AxisName.defaultAxisName; [SerializeField] protected AxisTick m_AxisTick = AxisTick.defaultTick; + [SerializeField] protected AxisMinorTick m_MinorTick = AxisMinorTick.defaultMinorTick; [SerializeField] protected AxisLabel m_AxisLabel = AxisLabel.defaultAxisLabel; [SerializeField] protected AxisSplitLine m_SplitLine = AxisSplitLine.defaultSplitLine; + [SerializeField] protected AxisMinorSplitLine m_MinorSplitLine = AxisMinorSplitLine.defaultMinorSplitLine; [SerializeField] protected AxisSplitArea m_SplitArea = AxisSplitArea.defaultSplitArea; public AxisContext context = new AxisContext(); @@ -352,6 +354,24 @@ namespace XCharts.Runtime set { if (value != null) { m_SplitArea = value; SetVerticesDirty(); } } } /// + /// axis minor tick. + /// |坐标轴次刻度。 + /// + public AxisMinorTick minorTick + { + get { return m_MinorTick; } + set { if (value != null) { m_MinorTick = value; SetVerticesDirty(); } } + } + /// + /// axis minor split line. + /// |坐标轴次分割线。 + /// + public AxisMinorSplitLine minorSplitLine + { + get { return m_MinorSplitLine; } + set { if (value != null) { m_MinorSplitLine = value; SetVerticesDirty(); } } + } + /// /// Whether to add new data at the head or at the end of the list. /// |添加新数据时是在列表的头部还是尾部加入。 /// @@ -369,7 +389,9 @@ namespace XCharts.Runtime axisLine.anyDirty || axisTick.anyDirty || splitLine.anyDirty || - splitArea.anyDirty; + splitArea.anyDirty || + minorTick.anyDirty || + minorSplitLine.anyDirty; } } @@ -398,6 +420,8 @@ namespace XCharts.Runtime axisTick.ClearVerticesDirty(); splitLine.ClearVerticesDirty(); splitArea.ClearVerticesDirty(); + minorTick.ClearVerticesDirty(); + minorSplitLine.ClearVerticesDirty(); } public override void SetComponentDirty() @@ -429,6 +453,8 @@ namespace XCharts.Runtime axis.axisLabel = axisLabel.Clone(); axis.splitLine = splitLine.Clone(); axis.splitArea = splitArea.Clone(); + axis.minorTick = minorTick.Clone(); + axis.minorSplitLine = minorSplitLine.Clone(); axis.icons = new List(); axis.data = new List(); ChartHelper.CopyList(axis.data, data); @@ -457,6 +483,8 @@ namespace XCharts.Runtime axisLabel.Copy(axis.axisLabel); splitLine.Copy(axis.splitLine); splitArea.Copy(axis.splitArea); + minorTick.Copy(axis.minorTick); + minorSplitLine.Copy(axis.minorSplitLine); ChartHelper.CopyList(data, axis.data); ChartHelper.CopyList(icons, axis.icons); } @@ -664,6 +692,18 @@ namespace XCharts.Runtime } } + public float GetValueLength(double value, float axisLength) + { + if (context.minMaxRange > 0) + { + return axisLength * ((float) (value / context.minMaxRange)); + } + else + { + return 0; + } + } + /// /// 获得指定区域缩放的类目数据列表 /// @@ -788,5 +828,16 @@ namespace XCharts.Runtime else return 0; } + + public void UpdateZeroOffset(float axisLength) + { + context.offset = context.minValue > 0 || context.minMaxRange == 0? + 0 : + (context.maxValue < 0 ? + axisLength : + (float) (Math.Abs(context.minValue) * (axisLength / + (Math.Abs(context.minValue) + Math.Abs(context.maxValue)))) + ); + } } } \ No newline at end of file diff --git a/Runtime/Component/Axis/AxisContext.cs b/Runtime/Component/Axis/AxisContext.cs index 37fcf14e..5a50c1e4 100644 --- a/Runtime/Component/Axis/AxisContext.cs +++ b/Runtime/Component/Axis/AxisContext.cs @@ -7,9 +7,21 @@ namespace XCharts.Runtime public class AxisContext : MainComponentContext { public Orient orient; + /// + /// 坐标轴的起点X + /// public float x; + /// + /// 坐标轴的起点Y + /// public float y; + /// + /// 坐标轴原点X + /// public float zeroX; + /// + /// 坐标轴原点Y + /// public float zeroY; public float width; public float height; @@ -34,6 +46,11 @@ namespace XCharts.Runtime /// public float offset; public double minMaxRange; + /// + /// the tick value of value axis. + /// |数值轴时每个tick的数值。 + /// + public double tickValue; public float scaleWidth; public float startAngle; public double pointerValue; diff --git a/Runtime/Component/Axis/AxisHandler.cs b/Runtime/Component/Axis/AxisHandler.cs index aa290a88..3e1a4de5 100644 --- a/Runtime/Component/Axis/AxisHandler.cs +++ b/Runtime/Component/Axis/AxisHandler.cs @@ -24,7 +24,7 @@ namespace XCharts return Vector3.zero; } - protected virtual float GetAxisLineXOrY() + internal virtual float GetAxisLineXOrY() { return 0; } @@ -38,7 +38,7 @@ namespace XCharts return; if (!grid.context.isPointerEnter) { - axis.context.pointerValue = double.PositiveInfinity; + axis.context.pointerValue = double.NaN; } else { @@ -171,31 +171,11 @@ namespace XCharts var grid = chart.GetChartComponent(axis.gridIndex); if (grid != null && axis is XAxis && axis.IsValue()) { - axis.context.offset = axis.context.minValue > 0 ? - 0 : - (axis.context.maxValue < 0 ? - grid.context.width : - (float) (Math.Abs(axis.context.minValue) * (grid.context.width / - (Math.Abs(axis.context.minValue) + Math.Abs(axis.context.maxValue)))) - ); - axis.context.x = grid.context.x; - axis.context.y = GetAxisLineXOrY(); - axis.context.zeroY = grid.context.y; - axis.context.zeroX = grid.context.x - (float) (axis.context.minValue * grid.context.width / axis.context.minMaxRange); + axis.UpdateZeroOffset(grid.context.width); } if (grid != null && axis is YAxis && axis.IsValue()) { - axis.context.offset = axis.context.minValue > 0 ? - 0 : - (axis.context.maxValue < 0 ? - grid.context.height : - (float) (Math.Abs(axis.context.minValue) * (grid.context.height / - (Math.Abs(axis.context.minValue) + Math.Abs(axis.context.maxValue)))) - ); - axis.context.x = GetAxisLineXOrY(); - axis.context.y = grid.context.y; - axis.context.zeroX = grid.context.x; - axis.context.zeroY = grid.context.y - (float) (axis.context.minValue * grid.context.height / axis.context.minMaxRange); + axis.UpdateZeroOffset(grid.context.height); } } @@ -260,6 +240,7 @@ namespace XCharts } } var value = 0d; + axis.context.tickValue = tick; if (Mathf.Approximately((float) (axis.context.minValue % tick), 0)) { value = axis.context.minValue; @@ -581,24 +562,21 @@ namespace XCharts if (AxisHelper.NeedShowSplit(axis)) { var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom); - - var current = orient == Orient.Horizonal ? - startX : - startY; - + var tickWidth = axis.axisTick.GetWidth(theme.tickWidth); + var tickColor = axis.axisTick.GetColor(theme.tickColor); + var current = orient == Orient.Horizonal ? startX : startY; + var lastTickX = 0f; + var lastTickY = 0f; + var minorTickSplitNumber = axis.minorTick.splitNumber <= 0 ? 5 : axis.minorTick.splitNumber; + var minorTickDistance = axis.GetValueLength(axis.context.tickValue / minorTickSplitNumber, axisLength); + var minorTickColor = axis.minorTick.GetColor(theme.tickColor); + var minorTickWidth = axis.minorTick.GetWidth(theme.tickWidth); + var minorTickLength = axis.minorTick.GetLength(theme.tickLength * 0.6f); for (int i = 0; i < size; i++) { var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom); - if (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel)) - { - current += scaleWidth; - continue; - } - if (i == size - 1 && !axis.axisTick.showEndTick) - { - current += scaleWidth; - continue; - } + var hideTick = (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel)) || + (i == size - 1 && !axis.axisTick.showEndTick); if (axis.axisTick.show) { if (orient == Orient.Horizonal) @@ -612,21 +590,44 @@ namespace XCharts var sY = 0f; var eY = 0f; + var mY = 0f; if ((axis.axisTick.inside && axis.IsBottom()) || (!axis.axisTick.inside && axis.IsTop())) { sY = startY + lineWidth; eY = sY + tickLength; + mY = sY + minorTickLength; } else { sY = startY - lineWidth; eY = sY - tickLength; + mY = sY - minorTickLength; } - - UGL.DrawLine(vh, new Vector3(pX, sY), new Vector3(pX, eY), - axis.axisTick.GetWidth(theme.tickWidth), - axis.axisTick.GetColor(theme.tickColor)); + if (!hideTick) + UGL.DrawLine(vh, new Vector3(pX, sY), new Vector3(pX, eY), tickWidth, tickColor); + if (axis.minorTick.show && i > 0 && minorTickDistance > 0) + { + if (lastTickX <= axis.context.zeroX || (i == 1 && pX > axis.context.zeroX)) + { + var tickTotal = pX - minorTickDistance; + while (tickTotal > lastTickX) + { + UGL.DrawLine(vh, new Vector3(tickTotal, sY), new Vector3(tickTotal, mY), minorTickWidth, minorTickColor); + tickTotal -= minorTickDistance; + } + } + else + { + var tickTotal = lastTickX + minorTickDistance; + while (tickTotal < pX) + { + UGL.DrawLine(vh, new Vector3(tickTotal, sY), new Vector3(tickTotal, mY), minorTickWidth, minorTickColor); + tickTotal += minorTickDistance; + } + } + } + lastTickX = pX; } else { @@ -639,21 +640,46 @@ namespace XCharts var sX = 0f; var eX = 0f; + var mX = 0f; if ((axis.axisTick.inside && axis.IsLeft()) || (!axis.axisTick.inside && axis.IsRight())) { sX = startX + lineWidth; eX = sX + tickLength; + mX = sX + minorTickLength; } else { sX = startX - lineWidth; eX = sX - tickLength; + mX = sX - minorTickLength; } + if (!hideTick) + UGL.DrawLine(vh, new Vector3(sX, pY), new Vector3(eX, pY), tickWidth, tickColor); + if (axis.minorTick.show && i > 0 && minorTickDistance > 0) + { + if (lastTickY <= axis.context.zeroY || (i == 1 && pY > axis.context.zeroY)) + { + var tickTotal = pY - minorTickDistance; + while (tickTotal > lastTickY) + { - UGL.DrawLine(vh, new Vector3(sX, pY), new Vector3(eX, pY), - axis.axisTick.GetWidth(theme.tickWidth), - axis.axisTick.GetColor(theme.tickColor)); + UGL.DrawLine(vh, new Vector3(sX, tickTotal), new Vector3(mX, tickTotal), minorTickWidth, minorTickColor); + tickTotal -= minorTickDistance; + } + } + else + { + var tickTotal = lastTickY + minorTickDistance; + while (tickTotal < pY) + { + + UGL.DrawLine(vh, new Vector3(sX, tickTotal), new Vector3(mX, tickTotal), minorTickWidth, minorTickColor); + tickTotal += minorTickDistance; + } + } + } + lastTickY = pY; } } current += scaleWidth; @@ -707,9 +733,12 @@ namespace XCharts } protected void DrawAxisSplit(VertexHelper vh, AxisTheme theme, DataZoom dataZoom, - Orient orient, float startX, float startY, float axisLength, float splitLength, Axis relativedAxis = null) + Orient orient, float startX, float startY, float axisLength, float splitLength, + Axis relativedAxis = null) { Axis axis = component; + var axisLineWidth = axis.axisLine.GetWidth(theme.lineWidth); + splitLength -= axisLineWidth; var lineColor = axis.splitLine.GetColor(theme.splitLineColor); var lineWidth = axis.splitLine.GetWidth(theme.lineWidth); var lineType = axis.splitLine.GetType(theme.splitLineType); @@ -725,6 +754,14 @@ namespace XCharts var current = orient == Orient.Horizonal ? startX : startY; + + var lastSplitX = 0f; + var lastSplitY = 0f; + var minorTickSplitNumber = axis.minorTick.splitNumber <= 0 ? 5 : axis.minorTick.splitNumber; + var minorTickDistance = axis.GetValueLength(axis.context.tickValue / minorTickSplitNumber, axisLength); + var minorSplitLineColor = axis.minorSplitLine.GetColor(theme.minorSplitLineColor); + var minorLineWidth = axis.minorSplitLine.GetWidth(theme.lineWidth); + var minorLineType = axis.minorSplitLine.GetType(theme.splitLineType); for (int i = 0; i < size; i++) { var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, axis.IsTime() ? i : i + 1, dataZoom); @@ -760,23 +797,99 @@ namespace XCharts { if (orient == Orient.Horizonal) { - if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY())) + if (relativedAxis == null || !MathUtil.Approximately(current, relativedAxis.context.x)) + { ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(current, startY), new Vector3(current, startY + splitLength), lineColor); + } + if (axis.minorSplitLine.show && i > 0 && minorTickDistance > 0) + { + if (lastSplitX <= axis.context.zeroX || (i == 1 && current > axis.context.zeroX)) + { + var tickTotal = current - minorTickDistance; + var count = 0; + while (tickTotal > lastSplitX && count < minorTickSplitNumber - 1) + { + ChartDrawer.DrawLineStyle(vh, + minorLineType, + minorLineWidth, + new Vector3(tickTotal, startY), + new Vector3(tickTotal, startY + splitLength), + minorSplitLineColor); + count++; + tickTotal -= minorTickDistance; + } + } + else + { + var tickTotal = lastSplitX + minorTickDistance; + var count = 0; + while (tickTotal < current && count < minorTickSplitNumber - 1) + { + ChartDrawer.DrawLineStyle(vh, + minorLineType, + minorLineWidth, + new Vector3(tickTotal, startY), + new Vector3(tickTotal, startY + splitLength), + minorSplitLineColor); + count++; + tickTotal += minorTickDistance; + } + } + } + lastSplitX = current; } else { - if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY())) + if (relativedAxis == null || !MathUtil.Approximately(current, relativedAxis.context.y)) + { ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(startX, current), new Vector3(startX + splitLength, current), lineColor); + } + if (axis.minorSplitLine.show && i > 0 && minorTickDistance > 0) + { + if (lastSplitY <= axis.context.zeroY || (i == 1 && current > axis.context.zeroY)) + { + var tickTotal = current - minorTickDistance; + var count = 0; + while (tickTotal > lastSplitY && count < minorTickSplitNumber - 1) + { + ChartDrawer.DrawLineStyle(vh, + minorLineType, + minorLineWidth, + new Vector3(startX, tickTotal), + new Vector3(startX + splitLength, tickTotal), + minorSplitLineColor); + count++; + tickTotal -= minorTickDistance; + } + } + else + { + var tickTotal = lastSplitY + minorTickDistance; + var count = 0; + while (tickTotal < current && count < minorTickSplitNumber - 1) + { + ChartDrawer.DrawLineStyle(vh, + minorLineType, + minorLineWidth, + new Vector3(startX, tickTotal), + new Vector3(startX + splitLength, tickTotal), + minorSplitLineColor); + count++; + tickTotal += minorTickDistance; + } + } + } + lastSplitY = current; } } } diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index 888e30cf..e24be302 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -338,8 +338,7 @@ namespace XCharts.Runtime axis.splitNumber = (minSplit > 0 && maxSplit > 0) ? (maxSplit + minSplit - 1) : (maxSplit + minSplit); return; } - if (axis.type == Axis.AxisType.Time) - { } + if (axis.type == Axis.AxisType.Time) { } else if (axis.minMaxType == Axis.AxisMinMaxType.Custom) { if (axis.min != 0 || axis.max != 0) @@ -363,8 +362,7 @@ namespace XCharts.Runtime { case Axis.AxisMinMaxType.Default: - if (minValue == 0 && maxValue == 0) - { } + if (minValue == 0 && maxValue == 0) { } else if (minValue > 0 && maxValue > 0) { minValue = 0; @@ -557,5 +555,43 @@ namespace XCharts.Runtime yDataHig; } } + + public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis) + { + if (axis is XAxis) + return GetXAxisXOrY(grid, axis, relativedAxis); + else if (axis is YAxis) + return GetYAxisXOrY(grid, axis, relativedAxis); + else if (axis is SingleAxis) + return axis.context.y + axis.offset; + else if (axis is ParallelAxis) + return axis.context.y; + else + return axis.context.x; + } + + public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis) + { + var startY = grid.context.y + xAxis.offset; + if (xAxis.IsTop()) + startY += grid.context.height; + else if (xAxis.axisLine.onZero && relativedAxis.IsValue() && relativedAxis.gridIndex == xAxis.gridIndex) + startY += relativedAxis.context.offset; + return startY; + } + + public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis) + { + var startX = grid.context.x + yAxis.offset; + if (yAxis.IsRight()) + startX += grid.context.width; + else if (yAxis.axisLine.onZero && relativedAxis.IsValue() && relativedAxis.gridIndex == yAxis.gridIndex) + startX += relativedAxis.context.offset; + return startX; + } + + public static void UpdateAxisOffset(){ + + } } } \ No newline at end of file diff --git a/Runtime/Component/Axis/AxisMinorSplitLine.cs b/Runtime/Component/Axis/AxisMinorSplitLine.cs new file mode 100644 index 00000000..6716705b --- /dev/null +++ b/Runtime/Component/Axis/AxisMinorSplitLine.cs @@ -0,0 +1,61 @@ +using System; +using UnityEngine; + +namespace XCharts.Runtime +{ + /// + /// Minor split line of axis in grid area. + /// |坐标轴在 grid 区域中的次分隔线。次分割线会对齐次刻度线 minorTick。 + /// + [Serializable] + public class AxisMinorSplitLine : BaseLine + { + [SerializeField] private float m_Distance; + [SerializeField] private bool m_AutoColor; + + /// + /// The distance between the split line and axis line. + /// |刻度线与轴线的距离。 + /// + public float distance { get { return m_Distance; } set { m_Distance = value; } } + /// + /// auto color. + /// |自动设置颜色。 + /// + public bool autoColor { get { return m_AutoColor; } set { m_AutoColor = value; } } + + public override bool vertsDirty { get { return m_VertsDirty || m_LineStyle.anyDirty; } } + public override void ClearVerticesDirty() + { + base.ClearVerticesDirty(); + m_LineStyle.ClearVerticesDirty(); + } + public static AxisMinorSplitLine defaultMinorSplitLine + { + get + { + return new AxisMinorSplitLine() + { + m_Show = false, + }; + } + } + + public AxisMinorSplitLine Clone() + { + var axisSplitLine = new AxisMinorSplitLine(); + axisSplitLine.show = show; + axisSplitLine.distance = distance; + axisSplitLine.autoColor = autoColor; + axisSplitLine.lineStyle = lineStyle.Clone(); + return axisSplitLine; + } + + public void Copy(AxisMinorSplitLine splitLine) + { + base.Copy(splitLine); + distance = splitLine.distance; + autoColor = splitLine.autoColor; + } + } +} \ No newline at end of file diff --git a/Runtime/Component/Axis/AxisMinorSplitLine.cs.meta b/Runtime/Component/Axis/AxisMinorSplitLine.cs.meta new file mode 100644 index 00000000..d1400a2d --- /dev/null +++ b/Runtime/Component/Axis/AxisMinorSplitLine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7be5a277811c64887a121d7711929aab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Component/Axis/AxisMinorTick.cs b/Runtime/Component/Axis/AxisMinorTick.cs new file mode 100644 index 00000000..67e16f48 --- /dev/null +++ b/Runtime/Component/Axis/AxisMinorTick.cs @@ -0,0 +1,63 @@ +using UnityEngine; + +namespace XCharts.Runtime +{ + /// + /// Settings related to axis minor tick. + /// |坐标轴次刻度相关设置。注意:次刻度无法再类目轴中使用。 + /// + [System.Serializable] + [Since("v3.2.0")] + public class AxisMinorTick : BaseLine + { + [SerializeField] protected int m_SplitNumber = 5; + [SerializeField] private bool m_AutoColor; + + /// + /// Number of segments that the axis is split into. + /// |分隔线之间分割的刻度数。 + /// + public int splitNumber + { + get { return m_SplitNumber; } + set { if (PropertyUtil.SetStruct(ref m_SplitNumber, value)) SetAllDirty(); } + } + public bool autoColor { get { return m_AutoColor; } set { m_AutoColor = value; } } + + public override bool vertsDirty { get { return m_VertsDirty || m_LineStyle.anyDirty; } } + public override void ClearVerticesDirty() + { + base.ClearVerticesDirty(); + m_LineStyle.ClearVerticesDirty(); + } + public static AxisMinorTick defaultMinorTick + { + get + { + var tick = new AxisMinorTick + { + m_Show = false + }; + return tick; + } + } + + public AxisMinorTick Clone() + { + var axisTick = new AxisMinorTick(); + axisTick.show = show; + axisTick.splitNumber = splitNumber; + axisTick.autoColor = autoColor; + axisTick.lineStyle = lineStyle.Clone(); + return axisTick; + } + + public void Copy(AxisMinorTick axisTick) + { + show = axisTick.show; + splitNumber = axisTick.splitNumber; + autoColor = axisTick.autoColor; + lineStyle.Copy(axisTick.lineStyle); + } + } +} \ No newline at end of file diff --git a/Runtime/Component/Axis/AxisMinorTick.cs.meta b/Runtime/Component/Axis/AxisMinorTick.cs.meta new file mode 100644 index 00000000..6dda4b2f --- /dev/null +++ b/Runtime/Component/Axis/AxisMinorTick.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3bea237f1eccc409ba2635e6f4ca609c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Component/Axis/ParallelAxis/ParallelAxisHander.cs b/Runtime/Component/Axis/ParallelAxis/ParallelAxisHander.cs index 76152220..0ae6185c 100644 --- a/Runtime/Component/Axis/ParallelAxis/ParallelAxisHander.cs +++ b/Runtime/Component/Axis/ParallelAxis/ParallelAxisHander.cs @@ -116,7 +116,6 @@ namespace XCharts.Runtime return; var dataZoom = chart.GetDataZoomOfAxis(axis); - DrawAxisSplit(vh, chart.theme.axis, dataZoom, m_Orient, axis.context.x, @@ -159,7 +158,7 @@ namespace XCharts.Runtime } } - protected override float GetAxisLineXOrY() + internal override float GetAxisLineXOrY() { return component.context.y; } diff --git a/Runtime/Component/Axis/SingleAxis/SingleAxisHandler.cs b/Runtime/Component/Axis/SingleAxis/SingleAxisHandler.cs index cea04762..28b33ef8 100644 --- a/Runtime/Component/Axis/SingleAxis/SingleAxisHandler.cs +++ b/Runtime/Component/Axis/SingleAxis/SingleAxisHandler.cs @@ -117,7 +117,7 @@ namespace XCharts.Runtime } } - protected override float GetAxisLineXOrY() + internal override float GetAxisLineXOrY() { return component.context.y + component.offset; } diff --git a/Runtime/Component/Axis/XAxis/XAxis.cs b/Runtime/Component/Axis/XAxis/XAxis.cs index 86059069..448a8395 100644 --- a/Runtime/Component/Axis/XAxis/XAxis.cs +++ b/Runtime/Component/Axis/XAxis/XAxis.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using UnityEngine; diff --git a/Runtime/Component/Axis/XAxis/XAxisHander.cs b/Runtime/Component/Axis/XAxis/XAxisHander.cs index e4020e08..fe701798 100644 --- a/Runtime/Component/Axis/XAxis/XAxisHander.cs +++ b/Runtime/Component/Axis/XAxis/XAxisHander.cs @@ -15,17 +15,32 @@ namespace XCharts.Runtime public override void Update() { + UpdateAxisMinMaxValue(component.index, component); UpdatePointerValue(component); } public override void DrawBase(VertexHelper vh) { + UpdatePosition(component); DrawXAxisSplit(vh, component); DrawXAxisLine(vh, component); DrawXAxisTick(vh, component); } + private void UpdatePosition(XAxis axis) + { + var grid = chart.GetChartComponent(axis.gridIndex); + if (grid != null && axis is XAxis && axis.IsValue()) + { + var relativedAxis = chart.GetChartComponent(axis.gridIndex); + axis.context.x = grid.context.x; + axis.context.y = AxisHelper.GetXAxisXOrY(grid, axis, relativedAxis); + axis.context.zeroY = grid.context.y; + axis.context.zeroX = grid.context.x + axis.context.offset; + } + } + private void InitXAxis(XAxis xAxis) { var theme = chart.theme; @@ -137,16 +152,9 @@ namespace XCharts.Runtime } } - protected override float GetAxisLineXOrY() + internal override float GetAxisLineXOrY() { - var xAxis = component; - var grid = chart.GetChartComponent(xAxis.gridIndex); - var startY = grid.context.y + xAxis.offset; - if (xAxis.IsTop()) - startY += grid.context.height; - else - startY += ComponentHelper.GetXAxisOnZeroOffset(chart.components, xAxis); - return startY; + return component.context.y; } } } \ No newline at end of file diff --git a/Runtime/Component/Axis/YAxis/YAxisHander.cs b/Runtime/Component/Axis/YAxis/YAxisHander.cs index 58041f55..1aa81a67 100644 --- a/Runtime/Component/Axis/YAxis/YAxisHander.cs +++ b/Runtime/Component/Axis/YAxis/YAxisHander.cs @@ -21,11 +21,25 @@ namespace XCharts.Runtime public override void DrawBase(VertexHelper vh) { + UpdatePosition(component); DrawYAxisSplit(vh, component.index, component); DrawYAxisLine(vh, component.index, component); DrawYAxisTick(vh, component.index, component); } + private void UpdatePosition(YAxis axis) + { + var grid = chart.GetChartComponent(axis.gridIndex); + if (grid != null && axis.IsValue()) + { + var relativedAxis = chart.GetChartComponent(axis.gridIndex); + axis.context.x = AxisHelper.GetYAxisXOrY(grid, axis, relativedAxis); + axis.context.y = grid.context.y; + axis.context.zeroX = axis.context.x; + axis.context.zeroY = axis.context.y + axis.context.offset; + } + } + private void InitYAxis(YAxis yAxis) { var theme = chart.theme; @@ -135,16 +149,9 @@ namespace XCharts.Runtime } } - protected override float GetAxisLineXOrY() + internal override float GetAxisLineXOrY() { - var yAxis = component; - var grid = chart.GetChartComponent(yAxis.gridIndex); - var startX = grid.context.x + yAxis.offset; - if (yAxis.IsRight()) - startX += grid.context.width; - else - startX += ComponentHelper.GetYAxisOnZeroOffset(chart.components, yAxis); - return startX; + return component.context.x; } } } \ No newline at end of file diff --git a/Runtime/Theme/AxisTheme.cs b/Runtime/Theme/AxisTheme.cs index ee5d8fdf..1cc388fc 100644 --- a/Runtime/Theme/AxisTheme.cs +++ b/Runtime/Theme/AxisTheme.cs @@ -18,6 +18,7 @@ namespace XCharts.Runtime [SerializeField] protected float m_SplitLineWidth = 1f; [SerializeField] protected float m_SplitLineLength = 0f; [SerializeField] protected Color32 m_SplitLineColor; + [SerializeField] protected Color32 m_MinorSplitLineColor; [SerializeField] protected float m_TickWidth = 1f; [SerializeField] protected float m_TickLength = 5f; [SerializeField] protected Color32 m_TickColor; @@ -87,7 +88,7 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetStruct(ref m_SplitLineLength, value)) SetVerticesDirty(); } } /// - /// the color of line. + /// the color of split line. /// |分割线线颜色。 /// public Color32 splitLineColor @@ -96,6 +97,15 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetColor(ref m_SplitLineColor, value)) SetVerticesDirty(); } } /// + /// the color of minor split line. + /// |次分割线线颜色。 + /// + public Color32 minorSplitLineColor + { + get { return ChartHelper.IsClearColor(m_MinorSplitLineColor) ? ColorUtil.GetColor("#F4F7FD") : m_MinorSplitLineColor; } + set { if (PropertyUtil.SetColor(ref m_MinorSplitLineColor, value)) SetVerticesDirty(); } + } + /// /// the length of tick. /// |刻度线线长。 /// @@ -146,33 +156,36 @@ namespace XCharts.Runtime switch (theme) { case ThemeType.Default: - m_LineColor = ColorUtil.GetColor("#514D4D"); - m_TickColor = ColorUtil.GetColor("#514D4D"); - m_SplitLineColor = ColorUtil.GetColor("#51515120"); + m_LineColor = ColorUtil.GetColor("#6E7079"); + m_TickColor = ColorUtil.GetColor("#6E7079"); + m_SplitLineColor = ColorUtil.GetColor("#E0E6F1"); + m_MinorSplitLineColor = ColorUtil.GetColor("#F4F7FD"); m_SplitAreaColors = new List { - new Color32(250, 250, 250, 77), - new Color32(200, 200, 200, 77) + new Color32(250, 250, 250, 51), + new Color32(210, 219, 238, 51) }; break; case ThemeType.Light: - m_LineColor = ColorUtil.GetColor("#514D4D"); - m_TickColor = ColorUtil.GetColor("#514D4D"); - m_SplitLineColor = ColorUtil.GetColor("#51515120"); + m_LineColor = ColorUtil.GetColor("#6E7079"); + m_TickColor = ColorUtil.GetColor("#6E7079"); + m_SplitLineColor = ColorUtil.GetColor("#E0E6F1"); + m_MinorSplitLineColor = ColorUtil.GetColor("#F4F7FD"); m_SplitAreaColors = new List { - new Color32(250, 250, 250, 77), - new Color32(200, 200, 200, 77) + new Color32(250, 250, 250, 51), + new Color32(210, 219, 238, 51) }; break; case ThemeType.Dark: - m_LineColor = ColorUtil.GetColor("#B9B8CE"); - m_TickColor = ColorUtil.GetColor("#B9B8CE"); - m_SplitLineColor = ColorUtil.GetColor("#484753"); + m_LineColor = ColorUtil.GetColor("#6E7079"); + m_TickColor = ColorUtil.GetColor("#6E7079"); + m_SplitLineColor = ColorUtil.GetColor("#E0E6F1"); + m_MinorSplitLineColor = ColorUtil.GetColor("#F4F7FD"); m_SplitAreaColors = new List { new Color32(255, 255, 255, (byte) (0.02f * 255)), - new Color32(255, 255, 255, (byte) (0.05f * 255)) + new Color32(210, 219, 238, (byte) (0.02f * 255)) }; break; } @@ -199,29 +212,25 @@ namespace XCharts.Runtime [Serializable] public class AxisTheme : BaseAxisTheme { - public AxisTheme(ThemeType theme) : base(theme) - { } + public AxisTheme(ThemeType theme) : base(theme) { } } [Serializable] public class RadiusAxisTheme : BaseAxisTheme { - public RadiusAxisTheme(ThemeType theme) : base(theme) - { } + public RadiusAxisTheme(ThemeType theme) : base(theme) { } } [Serializable] public class AngleAxisTheme : BaseAxisTheme { - public AngleAxisTheme(ThemeType theme) : base(theme) - { } + public AngleAxisTheme(ThemeType theme) : base(theme) { } } [Serializable] public class PolarAxisTheme : BaseAxisTheme { - public PolarAxisTheme(ThemeType theme) : base(theme) - { } + public PolarAxisTheme(ThemeType theme) : base(theme) { } } [Serializable] diff --git a/Runtime/Utilities/ColorUtil.cs b/Runtime/Utilities/ColorUtil.cs index ab650e4f..b5809792 100644 --- a/Runtime/Utilities/ColorUtil.cs +++ b/Runtime/Utilities/ColorUtil.cs @@ -1,11 +1,14 @@ +using System.Collections.Generic; using UnityEngine; namespace XCharts.Runtime { public static class ColorUtil { + private static Dictionary s_ColorCached = new Dictionary(); public static readonly Color32 clearColor32 = new Color32(0, 0, 0, 0); public static readonly Vector2 zeroVector2 = Vector2.zero; + /// /// Convert the html string to color. /// |将字符串颜色值转成Color。 @@ -14,9 +17,14 @@ namespace XCharts.Runtime /// public static Color32 GetColor(string hexColorStr) { + if (s_ColorCached.ContainsKey(hexColorStr)) + { + return s_ColorCached[hexColorStr]; + } Color color; ColorUtility.TryParseHtmlString(hexColorStr, out color); - return (Color32) color; + s_ColorCached[hexColorStr] = (Color32) color; + return s_ColorCached[hexColorStr]; } } } \ No newline at end of file