[feature][axis] support minor tick and minor split line

This commit is contained in:
monitor1394
2022-07-19 08:22:42 +08:00
parent eedafa7011
commit 0355e3ed46
22 changed files with 597 additions and 109 deletions

View File

@@ -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

View File

@@ -130,11 +130,14 @@ Inherits or Implemented: [MainComponentHandler](#MainComponentHandler)
| `GetAxisValueDistance()` |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上相对起点的距离 |
| `GetAxisValueLength()` |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上对应的长度 |
| `GetAxisValuePosition()` |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上的坐标位置 |
| `GetAxisXOrY()` |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)</br> |
| `GetDataWidth()` |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)</br>获得一个类目数据在坐标系中代表的宽度 |
| `GetEachWidth()` |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)</br> |
| `GetScaleNumber()` |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)</br>获得分割线条数 |
| `GetScaleWidth()` |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)</br>获得分割段宽度 |
| `GetSplitNumber()` |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)</br>获得分割段数 |
| `GetXAxisXOrY()` |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)</br> |
| `GetYAxisXOrY()` |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)</br> |
| `NeedShowSplit()` |public static bool NeedShowSplit(Axis axis)</br> |
## `BarChart`

View File

@@ -130,11 +130,14 @@ Inherits or Implemented: [MainComponentHandler](#MainComponentHandler)
| `GetAxisValueDistance()` |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上相对起点的距离 |
| `GetAxisValueLength()` |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上对应的长度 |
| `GetAxisValuePosition()` |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)</br>获得数值value在坐标轴上的坐标位置 |
| `GetAxisXOrY()` |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)</br> |
| `GetDataWidth()` |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)</br>获得一个类目数据在坐标系中代表的宽度 |
| `GetEachWidth()` |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)</br> |
| `GetScaleNumber()` |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)</br>获得分割线条数 |
| `GetScaleWidth()` |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)</br>获得分割段宽度 |
| `GetSplitNumber()` |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)</br>获得分割段数 |
| `GetXAxisXOrY()` |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)</br> |
| `GetYAxisXOrY()` |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)</br> |
| `NeedShowSplit()` |public static bool NeedShowSplit(Axis axis)</br> |
## `BarChart`

View File

@@ -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.</br>`LineStyle.Type`:</br>- `Solid`: 实线</br>- `Dashed`: 虚线</br>- `Dotted`: 点线</br>- `DashDot`: 点划线</br>- `DashDotDot`: 双点划线</br>- `None`: 双点划线</br>|
|`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`

View File

@@ -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`

View File

@@ -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");
}
}
}

View File

@@ -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

View File

@@ -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(); } }
}
/// <summary>
/// axis minor tick.
/// |坐标轴次刻度。
/// </summary>
public AxisMinorTick minorTick
{
get { return m_MinorTick; }
set { if (value != null) { m_MinorTick = value; SetVerticesDirty(); } }
}
/// <summary>
/// axis minor split line.
/// |坐标轴次分割线。
/// </summary>
public AxisMinorSplitLine minorSplitLine
{
get { return m_MinorSplitLine; }
set { if (value != null) { m_MinorSplitLine = value; SetVerticesDirty(); } }
}
/// <summary>
/// Whether to add new data at the head or at the end of the list.
/// |添加新数据时是在列表的头部还是尾部加入。
/// </summary>
@@ -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<Sprite>();
axis.data = new List<string>();
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<Sprite>(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;
}
}
/// <summary>
/// 获得指定区域缩放的类目数据列表
/// </summary>
@@ -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))))
);
}
}
}

View File

@@ -7,9 +7,21 @@ namespace XCharts.Runtime
public class AxisContext : MainComponentContext
{
public Orient orient;
/// <summary>
/// 坐标轴的起点X
/// </summary>
public float x;
/// <summary>
/// 坐标轴的起点Y
/// </summary>
public float y;
/// <summary>
/// 坐标轴原点X
/// </summary>
public float zeroX;
/// <summary>
/// 坐标轴原点Y
/// </summary>
public float zeroY;
public float width;
public float height;
@@ -34,6 +46,11 @@ namespace XCharts.Runtime
/// </summary>
public float offset;
public double minMaxRange;
/// <summary>
/// the tick value of value axis.
/// |数值轴时每个tick的数值。
/// </summary>
public double tickValue;
public float scaleWidth;
public float startAngle;
public double pointerValue;

View File

@@ -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<GridCoord>(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;
}
}
}

View File

@@ -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(){
}
}
}

View File

@@ -0,0 +1,61 @@
using System;
using UnityEngine;
namespace XCharts.Runtime
{
/// <summary>
/// Minor split line of axis in grid area.
/// |坐标轴在 grid 区域中的次分隔线。次分割线会对齐次刻度线 minorTick。
/// </summary>
[Serializable]
public class AxisMinorSplitLine : BaseLine
{
[SerializeField] private float m_Distance;
[SerializeField] private bool m_AutoColor;
/// <summary>
/// The distance between the split line and axis line.
/// |刻度线与轴线的距离。
/// </summary>
public float distance { get { return m_Distance; } set { m_Distance = value; } }
/// <summary>
/// auto color.
/// |自动设置颜色。
/// </summary>
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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7be5a277811c64887a121d7711929aab
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,63 @@
using UnityEngine;
namespace XCharts.Runtime
{
/// <summary>
/// Settings related to axis minor tick.
/// |坐标轴次刻度相关设置。注意:次刻度无法再类目轴中使用。
/// </summary>
[System.Serializable]
[Since("v3.2.0")]
public class AxisMinorTick : BaseLine
{
[SerializeField] protected int m_SplitNumber = 5;
[SerializeField] private bool m_AutoColor;
/// <summary>
/// Number of segments that the axis is split into.
/// |分隔线之间分割的刻度数。
/// </summary>
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);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3bea237f1eccc409ba2635e6f4ca609c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}

View File

@@ -117,7 +117,7 @@ namespace XCharts.Runtime
}
}
protected override float GetAxisLineXOrY()
internal override float GetAxisLineXOrY()
{
return component.context.y + component.offset;
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using UnityEngine;

View File

@@ -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<GridCoord>(axis.gridIndex);
if (grid != null && axis is XAxis && axis.IsValue())
{
var relativedAxis = chart.GetChartComponent<YAxis>(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<GridCoord>(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;
}
}
}

View File

@@ -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<GridCoord>(axis.gridIndex);
if (grid != null && axis.IsValue())
{
var relativedAxis = chart.GetChartComponent<XAxis>(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<GridCoord>(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;
}
}
}

View File

@@ -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(); }
}
/// <summary>
/// the color of line.
/// the color of split line.
/// |分割线线颜色。
/// </summary>
public Color32 splitLineColor
@@ -96,6 +97,15 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetColor(ref m_SplitLineColor, value)) SetVerticesDirty(); }
}
/// <summary>
/// the color of minor split line.
/// |次分割线线颜色。
/// </summary>
public Color32 minorSplitLineColor
{
get { return ChartHelper.IsClearColor(m_MinorSplitLineColor) ? ColorUtil.GetColor("#F4F7FD") : m_MinorSplitLineColor; }
set { if (PropertyUtil.SetColor(ref m_MinorSplitLineColor, value)) SetVerticesDirty(); }
}
/// <summary>
/// the length of tick.
/// |刻度线线长。
/// </summary>
@@ -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<Color32>
{
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<Color32>
{
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<Color32>
{
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]

View File

@@ -1,11 +1,14 @@
using System.Collections.Generic;
using UnityEngine;
namespace XCharts.Runtime
{
public static class ColorUtil
{
private static Dictionary<string, Color32> s_ColorCached = new Dictionary<string, Color32>();
public static readonly Color32 clearColor32 = new Color32(0, 0, 0, 0);
public static readonly Vector2 zeroVector2 = Vector2.zero;
/// <summary>
/// Convert the html string to color.
/// |将字符串颜色值转成Color。
@@ -14,9 +17,14 @@ namespace XCharts.Runtime
/// <returns></returns>
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];
}
}
}