From 057376882dc9be8549743868b7eef33dccf590cc Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Mon, 24 May 2021 07:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Axis=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E3=80=81=E8=87=AA=E5=8A=A8=E6=8D=A2=E8=A1=8C=E3=80=81?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=95=BF=E5=AE=BD=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XCharts/CHANGELOG.md | 4 + Assets/XCharts/Documentation/XChartsAPI.md | 3 + .../Documentation/XCharts配置项手册.md | 17 ++++ .../Documentation/xcharts-configuration-EN.md | 17 ++++ .../Editor/PropertyDrawers/AxisDrawer.cs | 8 +- .../Editor/PropertyDrawers/TextStyleDrawer.cs | 1 + .../Runtime/API/CoordinateChart_API.cs | 42 +++++++++- Assets/XCharts/Runtime/Component/Main/Axis.cs | 65 ++++++++++++--- .../Runtime/Component/Sub/AxisLabel.cs | 71 +++++++++++----- .../Runtime/Component/Sub/IconStyle.cs | 33 ++++++-- .../Runtime/Component/Sub/TextStyle.cs | 12 ++- Assets/XCharts/Runtime/Helper/AxisHelper.cs | 22 +++++ .../Runtime/Internal/CoordinateChart.cs | 83 ++++++++++++------- .../Runtime/Internal/Object/ChartLabel.cs | 69 +++++++++++++-- .../Runtime/Internal/Object/ChartObject.cs | 1 - .../Runtime/Internal/Utility/ChartHelper.cs | 30 ++++++- Assets/XCharts/Runtime/PolarChart.cs | 44 +++++----- 17 files changed, 416 insertions(+), 106 deletions(-) diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md index a15b3bf1..75a267ab 100644 --- a/Assets/XCharts/CHANGELOG.md +++ b/Assets/XCharts/CHANGELOG.md @@ -34,6 +34,10 @@ ## master +* (2021.05.23) 增加`TextStyle`的`wrap`设置是否自动换行 +* (2021.05.23) 增加`AxisLabel`的`autoAlign`设置是否让系统自动设置对齐方式 +* (2021.05.23) 增加`AxisLabel`的`width`和`height`支持自定义文本的长宽 +* (2021.05.23) 增加`Axis`的`iconStyle`和`icons`支持设置坐标轴标签显示图标 * (2021.05.20) 增加`Serie`和`Axis`的`insertDataToHead`参数控制数据插入头部还是尾部 * (2021.05.18) 优化`Editor`下的图表创建 #147 * (2021.05.16) 抽离`GanttChart`甘特图,通过扩展模块的方式来提供 diff --git a/Assets/XCharts/Documentation/XChartsAPI.md b/Assets/XCharts/Documentation/XChartsAPI.md index f0f821ec..cf2fe4ae 100644 --- a/Assets/XCharts/Documentation/XChartsAPI.md +++ b/Assets/XCharts/Documentation/XChartsAPI.md @@ -84,6 +84,9 @@ * `CoordinateChart.ClearAxisData()`:清除所有x轴和y轴的类目数据。 * `CoordinateChart.AddXAxisData(string category, int xAxisIndex = 0)`:添加一个类目数据到指定的 `X` 轴。 * `CoordinateChart.AddYAxisData(string category, int yAxisIndex = 0)`:添加一个类目数据到指定的 `Y` 轴。 +* `CoordinateChart.AddXAxisIcon(Sprite icon, int xAxisIndex = 0)`:添加一个类目数据到指定的 `X` 轴。 +* `CoordinateChart.AddYAxisIcon(Sprite icon, int yAxisIndex = 0)`:添加一个类目数据到指定的 `Y` 轴。。 + * `CoordinateChart.IsValue()`:是否是纯数值坐标。 * `CoordinateChart.RefreshDataZoom()`:在下一帧刷新DataZoom组件。 * `CoordinateChart.RefreshAxisMinMaxValue()`:立即刷新数值坐标轴的最大最小值(更新坐标轴标签并触发重绘)。 diff --git a/Assets/XCharts/Documentation/XCharts配置项手册.md b/Assets/XCharts/Documentation/XCharts配置项手册.md index 2b4163c8..67a663ee 100644 --- a/Assets/XCharts/Documentation/XCharts配置项手册.md +++ b/Assets/XCharts/Documentation/XCharts配置项手册.md @@ -51,6 +51,7 @@ * [SerieSymbol 图形标记](#SerieSymbol) * [TextLimit 文本自适应](#TextLimit) * [TextStyle 文本样式](#TextStyle) +* [IconStyle 图标样式](#IconStyle) ## `Theme` @@ -204,6 +205,7 @@ * `fontSize`:字体大小。 * `fontStyle`:字体风格。 * `lineSpacing`:行间距。 +* `wrap`:是否自动换行。 ## `Tooltip` @@ -399,12 +401,14 @@ * `inverse`:是否反向坐标轴。只在数值轴`Value`中有效。 * `insertDataToHead`:添加新数据时是在列表的头部还是尾部加入。 * `data`:类目数据,在类目轴(`type: 'Category'`)中有效。 +* `icons`:刻度的图标,在类目轴(`type: 'Category'`)中有效。 * `axisLine`:坐标轴轴线相关配置 [AxisLine](#AxisLine)。 * `axisName`:坐标轴名称相关配置 [AxisName](#AxisName)。 * `axisTick`:坐标轴刻度相关配置 [AxisTick](#AxisTick)。 * `axisLabel`:坐标轴刻度标签 [AxisLabel](#AxisLabel)。 * `splitLine`:坐标轴轴线坐标轴分割线 [AxisSplitLine](#SplitLine)。 * `splitArea`:坐标轴轴线坐标轴分割区域 [AxisSplitArea](#AxisSplitArea)。 +* `iconStyle`:坐标轴刻度图标的样式 [IconStyle](#IconStyle)。 相关接口: @@ -828,6 +832,9 @@ K线图系列。 * `numericFormatter`:标准数字格式字符串。用于将数值格式化显示为字符串。使用`Axx`的形式:`A`是格式说明符的单字符,支持`C`货币、`D`十进制、`E`指数、`F`顶点数、`G`常规、`N`数字、`P`百分比、`R`往返过程、`X`十六进制等九种。`xx`是精度说明,从`0`-`99`。 * `showAsPositiveNumber`:将负数数值显示为正数。一般和`Serie`的`showAsPositiveNumber`配合使用。 * `onZero`:刻度标签显示在`0`刻度上。 +* `width`:刻度标签的宽。当为0时系统自动设置。 +* `height`:刻度标签的高。当为0时系统自动设置。 +* `autoAlign`:是否让系统自动设置对齐方式。为true时系统自动选择对齐方式,为false时用textStyle的对齐方式。 * `textLimit`:文本自适应 [TextLimit](#TextLimit)。只在类目轴中有效。 * `textStyle`:文本样式 [TextStyle](#TextStyle)。 @@ -1018,6 +1025,16 @@ K线图系列。 * `interval`:显示图形标记的间隔。`0`表示显示所有标签,`1`表示隔一个隔显示一个标签,以此类推。 * `forceShowLast`:是否强制显示最后一个图形标记。默认为 `false`。 +## `IconStyle` + +* `show`:是否显示图标。 +* `layer`:显示在上层还是在下层。 +* `sprite`:图标。 +* `color`:颜色。 +* `width`:图标的宽。 +* `height`:图标的高。 +* `offset`:位置偏移。 + [返回首页](https://github.com/monitor1394/unity-ugui-XCharts) [XChartsAPI接口](XChartsAPI.md) [XCharts问答](XCharts问答.md) diff --git a/Assets/XCharts/Documentation/xcharts-configuration-EN.md b/Assets/XCharts/Documentation/xcharts-configuration-EN.md index 3167643e..3571669d 100644 --- a/Assets/XCharts/Documentation/xcharts-configuration-EN.md +++ b/Assets/XCharts/Documentation/xcharts-configuration-EN.md @@ -54,6 +54,7 @@ __Sub component:__ * [SerieSymbol](#SerieSymbol) * [TextLimit](#TextLimit) * [TextStyle](#TextStyle) +* [IconStyle](#IconStyle) ## `Theme` @@ -211,6 +212,7 @@ The component of settings related to text. * `fontSize`: the size of text. [default: `18`]. * `fontStyle`: the font style of text. [default: `FontStyle.Normal`]. * `lineSpacing`: the space of text line. [default: `1f`]. +* `wrap`: Whether to wrap lines. ## `Tooltip` @@ -397,12 +399,14 @@ The x axis in cartesian(rectangular) coordinate. a grid component can place at m * `inverse`: Whether the axis are reversed or not. Invalid in `Category` axis. * `insertDataToHead`: Whether to add new data at the head or at the end of the list. * `data`: Category data, valid in the `Category` axis. +* `icons`: icon list. * `axisLine`: the style of axis line [AxisLine](#AxisLine). * `axisName`: the style of axis name [AxisName](#AxisName). * `axisTick`: the style of axis tick [AxisTick](#AxisTick). * `axisLabel`: the style of axis label [AxisLabel](#AxisLabel). * `splitLine`: the style of axis split line [AxisSplitLine](#SplitLine). * `splitArea`: the style of axis split area [AxisSplitArea](#AxisSplitArea). +* `iconStyle`: the style of the axis scale icon [IconStyle](#IconStyle). ## `Background` @@ -722,6 +726,9 @@ K线图系列。 * `numericFormatter`: 标准数字格式字符串。用于将数值格式化显示为字符串。使用`Axx`的形式: `A`是格式说明符的单字符,支持`C`货币、`D`十进制、`E`指数、`F`顶点数、`G`常规、`N`数字、`P`百分比、`R`往返过程、`X`十六进制等九种。`xx`是精度说明,从`0`-`99`。 * `showAsPositiveNumber`: 将负数数值显示为正数。一般和`Serie`的`showAsPositiveNumber`配合使用。 * `onZero`: 刻度标签显示在`0`刻度上。 +* `width`:刻度标签的宽。当为0时系统自动设置。 +* `height`:刻度标签的高。当为0时系统自动设置。 +* `autoAlign`:是否让系统自动设置对齐方式。为true时系统自动选择对齐方式,为false时用textStyle的对齐方式。 * `textLimit`: 文本自适应 [TextLimit](#TextLimit)。只在类目轴中有效。 * `textStyle`: The style of text [TextStyle](#TextStyle). @@ -912,6 +919,16 @@ K线图系列。 * `interval`: 显示图形标记的间隔。`0`表示显示所有标签,`1`表示隔一个隔显示一个标签,以此类推。 * `forceShowLast`: 是否强制显示最后一个图形标记。默认为 `false`。 +## `IconStyle` + +* `show` : whether to show the icon. +* `Layer` : Shows on top or bottom. +* `Sprite` : Icon. +* `color` : color. +* `width` : The width of the icon. +* `height` : the height of the icon. +* `Offset` : Offset. + [返回首页](https://github.com/monitor1394/unity-ugui-XCharts) [XChartsAPI接口](XChartsAPI.md) [XCharts问答](XCharts问答.md) diff --git a/Assets/XCharts/Editor/PropertyDrawers/AxisDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/AxisDrawer.cs index 1fe39ccb..0cf308ff 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/AxisDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/AxisDrawer.cs @@ -83,7 +83,8 @@ namespace XCharts PropertyField(prop, "m_AxisLabel"); PropertyField(prop, "m_SplitLine"); PropertyField(prop, "m_SplitArea"); - + PropertyField(prop, "m_IconStyle"); + PropertyListField(prop, "m_Icons", true); if (type == Axis.AxisType.Category) { PropertyListField(prop, "m_Data", true); @@ -133,13 +134,16 @@ namespace XCharts if (MakeFoldout(prop, "m_Show")) { ++EditorGUI.indentLevel; - PropertyField(prop, "m_Formatter"); PropertyField(prop, "m_Inside"); PropertyField(prop, "m_Interval"); PropertyField(prop, "m_Margin"); + PropertyField(prop, "m_Width"); + PropertyField(prop, "m_Height"); + PropertyField(prop, "m_Formatter"); PropertyField(prop, "m_NumericFormatter"); PropertyField(prop, "m_ShowAsPositiveNumber"); PropertyField(prop, "m_OnZero"); + PropertyField(prop, "m_AutoAlign"); PropertyField(prop, "m_TextLimit"); PropertyField(prop, "m_TextStyle"); --EditorGUI.indentLevel; diff --git a/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs index dfddb82f..c909cfe8 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/TextStyleDrawer.cs @@ -28,6 +28,7 @@ namespace XCharts #else PropertyField(prop, "m_Font"); #endif + PropertyField(prop, "m_Wrap"); PropertyField(prop, "m_Rotate"); PropertyField(prop, "m_Offset"); PropertyField(prop, "m_Color"); diff --git a/Assets/XCharts/Runtime/API/CoordinateChart_API.cs b/Assets/XCharts/Runtime/API/CoordinateChart_API.cs index 30228691..64794a22 100644 --- a/Assets/XCharts/Runtime/API/CoordinateChart_API.cs +++ b/Assets/XCharts/Runtime/API/CoordinateChart_API.cs @@ -100,7 +100,26 @@ namespace XCharts /// which xAxis should category add to public void AddXAxisData(string category, int xAxisIndex = 0) { - m_XAxes[xAxisIndex].AddData(category); + var xAxis = GetXAxis(xAxisIndex); + if (xAxis != null) + { + xAxis.AddData(category); + } + } + + /// + /// Add an icon to xAxis. + /// 添加一个图标到指定的x轴。 + /// + /// + /// + public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0) + { + var xAxis = GetXAxis(xAxisIndex); + if (xAxis != null) + { + xAxis.AddIcon(icon); + } } /// @@ -111,7 +130,26 @@ namespace XCharts /// which yAxis should category add to public void AddYAxisData(string category, int yAxisIndex = 0) { - m_YAxes[yAxisIndex].AddData(category); + var yAxis = GetYAxis(yAxisIndex); + if (yAxis != null) + { + yAxis.AddData(category); + } + } + + /// + /// Add an icon to yAxis. + /// 添加一个图标到指定的y轴。 + /// + /// + /// + public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0) + { + var yAxis = GetYAxis(yAxisIndex); + if (yAxis != null) + { + yAxis.AddIcon(icon); + } } /// diff --git a/Assets/XCharts/Runtime/Component/Main/Axis.cs b/Assets/XCharts/Runtime/Component/Main/Axis.cs index 3ec8ad1a..5912ec5b 100644 --- a/Assets/XCharts/Runtime/Component/Main/Axis.cs +++ b/Assets/XCharts/Runtime/Component/Main/Axis.cs @@ -100,6 +100,8 @@ namespace XCharts [SerializeField] protected bool m_Inverse = false; [SerializeField] private bool m_Clockwise = true; [SerializeField] private bool m_InsertDataToHead; + [SerializeField] private IconStyle m_IconStyle = new IconStyle(); + [SerializeField] protected List m_Icons = new List(); [SerializeField] protected List m_Data = new List(); [SerializeField] protected AxisLine m_AxisLine = AxisLine.defaultAxisLine; [SerializeField] protected AxisName m_AxisName = AxisName.defaultAxisName; @@ -288,6 +290,14 @@ namespace XCharts set { if (value != null) { m_Data = value; SetAllDirty(); } } } /// + /// 类目数据对应的图标。 + /// + public List icons + { + get { return m_Icons; } + set { if (value != null) { m_Icons = value; SetAllDirty(); } } + } + /// /// axis Line. /// 坐标轴轴线。 /// /// @@ -350,6 +360,14 @@ namespace XCharts get { return m_InsertDataToHead; } set { if (PropertyUtil.SetStruct(ref m_InsertDataToHead, value)) SetAllDirty(); } } + /// + /// 图标样式。 + /// + public IconStyle iconStyle + { + get { return m_IconStyle; } + set { if (PropertyUtil.SetClass(ref m_IconStyle, value)) SetAllDirty(); } + } public override bool vertsDirty { get { return m_VertsDirty || axisLine.anyDirty || axisTick.anyDirty || splitLine.anyDirty || splitArea.anyDirty; } @@ -374,11 +392,7 @@ namespace XCharts splitArea.ClearVerticesDirty(); } public int index { get; internal set; } - /// - /// the axis label text list. - /// 坐标轴刻度标签的Text列表。 - /// - public List axisLabelTextList { get { return m_AxisLabelTextList; } set { m_AxisLabelTextList = value; } } + public List runtimeAxisLabelList { get { return m_AxisLabelList; } set { m_AxisLabelList = value; } } /// /// the current minimun value. /// 当前最小值。 @@ -429,7 +443,7 @@ namespace XCharts private int filterEnd; private int filterMinShow; private List filterData; - private List m_AxisLabelTextList = new List(); + private List m_AxisLabelList = new List(); private GameObject m_TooltipLabel; private ChartText m_TooltipLabelText; private RectTransform m_TooltipLabelRect; @@ -461,12 +475,15 @@ namespace XCharts axis.logBase = logBase; axis.logBaseE = logBaseE; axis.ceilRate = ceilRate; + axis.insertDataToHead = insertDataToHead; + axis.iconStyle = iconStyle.Clone(); axis.axisLine = axisLine.Clone(); axis.axisName = axisName.Clone(); axis.axisTick = axisTick.Clone(); axis.axisLabel = axisLabel.Clone(); axis.splitLine = splitLine.Clone(); axis.splitArea = splitArea.Clone(); + axis.icons = new List(); axis.data = new List(); ChartHelper.CopyList(axis.data, data); return axis; @@ -487,6 +504,8 @@ namespace XCharts logBase = axis.logBase; logBaseE = axis.logBaseE; ceilRate = axis.ceilRate; + insertDataToHead = axis.insertDataToHead; + iconStyle.Copy(axis.iconStyle); axisLine.Copy(axis.axisLine); axisName.Copy(axis.axisName); axisTick.Copy(axis.axisTick); @@ -494,6 +513,7 @@ namespace XCharts splitLine.Copy(axis.splitLine); splitArea.Copy(axis.splitArea); ChartHelper.CopyList(data, axis.data); + ChartHelper.CopyList(icons, axis.icons); } /// @@ -502,6 +522,7 @@ namespace XCharts public void ClearData() { m_Data.Clear(); + m_Icons.Clear(); m_RuntimeData.Clear(); SetAllDirty(); } @@ -552,6 +573,20 @@ namespace XCharts SetAllDirty(); } + public void AddIcon(Sprite icon) + { + if (maxCache > 0) + { + while (m_Icons.Count > maxCache) + { + m_Icons.RemoveAt(m_InsertDataToHead ? m_Icons.Count - 1 : 0); + } + } + if (m_InsertDataToHead) m_Icons.Insert(0, icon); + else m_Icons.Add(icon); + SetAllDirty(); + } + /// /// 获得指定索引的类目数据 /// @@ -580,6 +615,14 @@ namespace XCharts return ""; } + public Sprite GetIcon(int index) + { + if (index >= 0 && index < m_Icons.Count) + return m_Icons[index]; + else + return null; + } + /// /// 获得指定区域缩放的类目数据列表 /// @@ -667,12 +710,12 @@ namespace XCharts { var minValue = GetCurrMinValue(duration); var maxValue = GetCurrMaxValue(duration); - for (int i = 0; i < axisLabelTextList.Count; i++) + for (int i = 0; i < runtimeAxisLabelList.Count; i++) { - if (axisLabelTextList[i] != null) + if (runtimeAxisLabelList[i] != null) { var text = AxisHelper.GetLabelName(this, coordinateWidth, i, minValue, maxValue, dataZoom, forcePercent); - axisLabelTextList[i].SetText(text); + runtimeAxisLabelList[i].SetText(text); } } } @@ -876,7 +919,8 @@ namespace XCharts m_Data = new List() { "x1","x2","x3","x4","x5" - } + }, + m_Icons = new List(5), }; axis.splitLine.show = false; axis.splitLine.lineStyle.type = LineStyle.Type.None; @@ -908,6 +952,7 @@ namespace XCharts m_BoundaryGap = false, m_Position = AxisPosition.Left, m_Data = new List(5), + }; axis.splitLine.show = true; axis.splitLine.lineStyle.type = LineStyle.Type.None; diff --git a/Assets/XCharts/Runtime/Component/Sub/AxisLabel.cs b/Assets/XCharts/Runtime/Component/Sub/AxisLabel.cs index c8164aaf..5aaabfc0 100644 --- a/Assets/XCharts/Runtime/Component/Sub/AxisLabel.cs +++ b/Assets/XCharts/Runtime/Component/Sub/AxisLabel.cs @@ -26,6 +26,9 @@ namespace XCharts [SerializeField] private string m_NumericFormatter = ""; [SerializeField] private bool m_ShowAsPositiveNumber = false; [SerializeField] private bool m_OnZero = false; + [SerializeField] private float m_Width = 0f; + [SerializeField] private float m_Height = 0f; + [SerializeField] private bool m_AutoAlign = true; [SerializeField] private TextLimit m_TextLimit = new TextLimit(); [SerializeField] private TextStyle m_TextStyle = new TextStyle(); @@ -106,6 +109,30 @@ namespace XCharts get { return m_OnZero; } set { if (PropertyUtil.SetStruct(ref m_OnZero, value)) SetComponentDirty(); } } + /// + /// 文本的宽。为0时会自动匹配。 + /// + public float width + { + get { return m_Width; } + set { if (PropertyUtil.SetStruct(ref m_Width, value)) SetComponentDirty(); } + } + /// + /// 文本的高。为0时会自动匹配。 + /// + public float height + { + get { return m_Height; } + set { if (PropertyUtil.SetStruct(ref m_Height, value)) SetComponentDirty(); } + } + /// + /// 文本是否自动选对齐方式。为false时会用TextStyle下的alignment。 + /// + public bool autoAlign + { + get { return m_AutoAlign; } + set { if (PropertyUtil.SetStruct(ref m_AutoAlign, value)) SetComponentDirty(); } + } /// /// 文本限制。 @@ -150,28 +177,34 @@ namespace XCharts public AxisLabel Clone() { - var axisLable = new AxisLabel(); - axisLable.show = show; - axisLable.formatter = formatter; - axisLable.interval = interval; - axisLable.inside = inside; - axisLable.margin = margin; - axisLable.numericFormatter = numericFormatter; - axisLable.textLimit = textLimit.Clone(); - axisLable.textStyle.Copy(textStyle); - return axisLable; + var axisLabel = new AxisLabel(); + axisLabel.show = show; + axisLabel.formatter = formatter; + axisLabel.interval = interval; + axisLabel.inside = inside; + axisLabel.margin = margin; + axisLabel.numericFormatter = numericFormatter; + axisLabel.width = width; + axisLabel.height = height; + axisLabel.autoAlign = autoAlign; + axisLabel.textLimit = textLimit.Clone(); + axisLabel.textStyle.Copy(textStyle); + return axisLabel; } - public void Copy(AxisLabel axisLable) + public void Copy(AxisLabel axisLabel) { - show = axisLable.show; - formatter = axisLable.formatter; - interval = axisLable.interval; - inside = axisLable.inside; - margin = axisLable.margin; - numericFormatter = axisLable.numericFormatter; - textLimit.Copy(axisLable.textLimit); - textStyle.Copy(axisLable.textStyle); + show = axisLabel.show; + formatter = axisLabel.formatter; + interval = axisLabel.interval; + inside = axisLabel.inside; + margin = axisLabel.margin; + numericFormatter = axisLabel.numericFormatter; + width = axisLabel.width; + height = axisLabel.height; + autoAlign = axisLabel.autoAlign; + textLimit.Copy(axisLabel.textLimit); + textStyle.Copy(axisLabel.textStyle); } public void SetRelatedText(ChartText txt, float labelWidth) diff --git a/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs index 3f9cd4c4..1addc799 100644 --- a/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs +++ b/Assets/XCharts/Runtime/Component/Sub/IconStyle.cs @@ -10,9 +10,6 @@ using UnityEngine.UI; namespace XCharts { - /// - /// 系列数据项的图标 - /// [System.Serializable] public class IconStyle : SubComponent { @@ -25,8 +22,8 @@ namespace XCharts [SerializeField] private Layer m_Layer; [SerializeField] private Sprite m_Sprite; [SerializeField] private Color m_Color = Color.white; - [SerializeField] private float m_Width = 40; - [SerializeField] private float m_Height = 40; + [SerializeField] private float m_Width = 20; + [SerializeField] private float m_Height = 20; [SerializeField] private Vector3 m_Offset; public void Reset() @@ -35,8 +32,8 @@ namespace XCharts m_Layer = Layer.UnderLabel; m_Sprite = null; m_Color = Color.white; - m_Width = 40; - m_Height = 40; + m_Width = 20; + m_Height = 20; m_Offset = Vector3.zero; } /// @@ -70,6 +67,28 @@ namespace XCharts /// public Vector3 offset { get { return m_Offset; } set { m_Offset = value; } } + public IconStyle Clone() + { + var iconStyle = new IconStyle(); + iconStyle.show = show; + iconStyle.layer = layer; + iconStyle.sprite = sprite; + iconStyle.color = color; + iconStyle.width = width; + iconStyle.height = height; + iconStyle.offset = offset; + return iconStyle; + } + public void Copy(IconStyle iconStyle) + { + show = iconStyle.show; + layer = iconStyle.layer; + sprite = iconStyle.sprite; + color = iconStyle.color; + width = iconStyle.width; + height = iconStyle.height; + offset = iconStyle.offset; + } } } diff --git a/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs index bde1a9fb..7f09c63d 100644 --- a/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs +++ b/Assets/XCharts/Runtime/Component/Sub/TextStyle.cs @@ -22,6 +22,7 @@ namespace XCharts { [SerializeField] private Font m_Font; + [SerializeField] private bool m_Wrap = true; [SerializeField] private float m_Rotate = 0; [SerializeField] private Vector2 m_Offset = Vector2.zero; [SerializeField] private Color m_Color = Color.clear; @@ -119,6 +120,14 @@ namespace XCharts set { if (PropertyUtil.SetStruct(ref m_LineSpacing, value)) SetComponentDirty(); } } /// + /// 是否自动换行。 + /// + public bool wrap + { + get { return m_Wrap; } + set { if (PropertyUtil.SetStruct(ref m_Wrap, value)) SetComponentDirty(); } + } + /// /// 对齐方式。 /// public TextAnchor alignment @@ -186,6 +195,7 @@ namespace XCharts fontStyle = textStyle.fontStyle; lineSpacing = textStyle.lineSpacing; alignment = textStyle.alignment; + wrap = textStyle.wrap; #if dUI_TextMeshPro m_TMPFont = textStyle.tmpFont; m_TMPAlignment = textStyle.tmpAlignment; @@ -210,7 +220,7 @@ namespace XCharts public int GetFontSize(ComponentTheme defaultTheme) { - if(fontSize == 0) return defaultTheme.fontSize; + if (fontSize == 0) return defaultTheme.fontSize; else return fontSize; } } diff --git a/Assets/XCharts/Runtime/Helper/AxisHelper.cs b/Assets/XCharts/Runtime/Helper/AxisHelper.cs index aca9b656..a1fe0b2f 100644 --- a/Assets/XCharts/Runtime/Helper/AxisHelper.cs +++ b/Assets/XCharts/Runtime/Helper/AxisHelper.cs @@ -424,6 +424,28 @@ namespace XCharts txt.SetLocalPosition(pos + offset); } + public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset) + { + var txtWidth = txt.label.GetPreferredWidth(); + var sizeDelta = new Vector2(txtWidth, txt.label.GetPreferredHeight()); + txt.label.SetSizeDelta(sizeDelta); + var diff = pos.x - cenPos.x; + if (diff < -1f) //left + { + pos = new Vector3(pos.x - txtWidth / 2, pos.y); + } + else if (diff > 1f) //right + { + pos = new Vector3(pos.x + txtWidth / 2, pos.y); + } + else + { + float y = pos.y > cenPos.y ? pos.y + txtHig / 2 : pos.y - txtHig / 2; + pos = new Vector3(pos.x, y); + } + txt.SetPosition(pos + offset); + } + public static void AdjustRadiusAxisLabelPos(ChartText txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset) { var txtWidth = txt.GetPreferredWidth(); diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs index d1092321..bef689f7 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart.cs @@ -538,8 +538,8 @@ namespace XCharts var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin, graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); yAxis.gameObject = axisObj; - yAxis.axisLabelTextList.Clear(); - axisObj.SetActive(yAxis.show && yAxis.axisLabel.show); + yAxis.runtimeAxisLabelList.Clear(); + axisObj.SetActive(yAxis.show); axisObj.hideFlags = chartHideFlags; ChartHelper.HideAllObject(axisObj); var grid = GetAxisGridOrDefault(yAxis); @@ -549,34 +549,46 @@ namespace XCharts float totalWidth = 0; float eachWidth = AxisHelper.GetEachWidth(yAxis, grid.runtimeHeight, dataZoom); float gapWidth = yAxis.boundaryGap ? eachWidth / 2 : 0; - if (yAxis.IsCategory()) splitNumber += 1; + float textWidth = yAxis.axisLabel.width > 0 + ? yAxis.axisLabel.width + : grid.left; + float textHeight = yAxis.axisLabel.height > 0 + ? yAxis.axisLabel.height + : 20f; + if (yAxis.IsCategory() && yAxis.boundaryGap) + { + splitNumber -= 1; + } for (int i = 0; i < splitNumber; i++) { - ChartText txt; + ChartLabel txt; var inside = yAxis.axisLabel.inside; var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); var labelName = AxisHelper.GetLabelName(yAxis, grid.runtimeHeight, i, yAxis.runtimeMinValue, yAxis.runtimeMaxValue, dataZoom, isPercentStack); if ((inside && yAxis.IsLeft()) || (!inside && yAxis.IsRight())) { - txt = ChartHelper.AddTextObject(objName + i, axisObj.transform, Vector2.zero, - Vector2.zero, new Vector2(0, 0.5f), new Vector2(grid.left, 20), axisLabelTextStyle, - m_Theme.axis); - txt.SetAlignment(TextAnchor.MiddleLeft); + txt = ChartHelper.AddAxisLabelObject(i, objName + i, axisObj.transform, Vector2.zero, + Vector2.zero, new Vector2(0, 0.5f), new Vector2(textWidth, textHeight), yAxis, theme.axis); + if (yAxis.axisLabel.autoAlign) + { + txt.label.SetAlignment(TextAnchor.MiddleLeft); + } } else { - txt = ChartHelper.AddTextObject(objName + i, axisObj.transform, Vector2.zero, - Vector2.zero, new Vector2(1, 0.5f), new Vector2(grid.left, 20), axisLabelTextStyle, - m_Theme.axis); - txt.SetAlignment(TextAnchor.MiddleRight); + txt = ChartHelper.AddAxisLabelObject(i, objName + i, axisObj.transform, Vector2.zero, + Vector2.zero, new Vector2(1, 0.5f), new Vector2(textWidth, textHeight), yAxis, theme.axis); + if (yAxis.axisLabel.autoAlign) + { + txt.label.SetAlignment(TextAnchor.MiddleRight); + } } var labelWidth = AxisHelper.GetScaleWidth(yAxis, grid.runtimeHeight, i + 1, dataZoom); - if (i == 0) yAxis.axisLabel.SetRelatedText(txt, labelWidth); - txt.SetLocalPosition(GetLabelYPosition(totalWidth + gapWidth, i, yAxisIndex, yAxis)); + if (i == 0) yAxis.axisLabel.SetRelatedText(txt.label, labelWidth); + txt.SetPosition(GetLabelYPosition(totalWidth + gapWidth, i, yAxisIndex, yAxis)); txt.SetText(labelName); - txt.SetActive(yAxis.show && (yAxis.axisLabel.interval == 0 || i % (yAxis.axisLabel.interval + 1) == 0)); - yAxis.axisLabelTextList.Add(txt); + yAxis.runtimeAxisLabelList.Add(txt); totalWidth += labelWidth; } if (yAxis.axisName.show) @@ -654,8 +666,8 @@ namespace XCharts var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin, graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); xAxis.gameObject = axisObj; - xAxis.axisLabelTextList.Clear(); - axisObj.SetActive(xAxis.show && xAxis.axisLabel.show); + xAxis.runtimeAxisLabelList.Clear(); + axisObj.SetActive(xAxis.show); axisObj.hideFlags = chartHideFlags; ChartHelper.HideAllObject(axisObj); var grid = GetAxisGridOrDefault(xAxis); @@ -666,22 +678,33 @@ namespace XCharts float totalWidth = 0; float eachWidth = AxisHelper.GetEachWidth(xAxis, grid.runtimeWidth, dataZoom); float gapWidth = xAxis.boundaryGap ? eachWidth / 2 : 0; - float textWidth = AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, 0, dataZoom); - //if (xAxis.IsCategory() && xAxis.boundaryGap) splitNumber += 1; + float textWidth = xAxis.axisLabel.width > 0 + ? xAxis.axisLabel.width + : AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, 0, dataZoom); + float textHeight = xAxis.axisLabel.height > 0 + ? xAxis.axisLabel.height + : 20f; + if (xAxis.IsCategory() && xAxis.boundaryGap) + { + splitNumber -= 1; + } for (int i = 0; i < splitNumber; i++) { var labelWidth = AxisHelper.GetScaleWidth(xAxis, grid.runtimeWidth, i + 1, dataZoom); var inside = xAxis.axisLabel.inside; var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); - var txt = ChartHelper.AddTextObject(ChartCached.GetXAxisName(xAxisIndex, i), axisObj.transform, new Vector2(0, 1), - new Vector2(0, 1), new Vector2(1, 0.5f), new Vector2(textWidth, 20), axisLabelTextStyle, theme.axis); - if (i == 0) xAxis.axisLabel.SetRelatedText(txt, labelWidth); - txt.SetAlignment(TextAnchor.MiddleCenter); - txt.SetLocalPosition(GetLabelXPosition(totalWidth + textWidth / 2 + gapWidth, i, xAxisIndex, xAxis)); - txt.SetText(AxisHelper.GetLabelName(xAxis, grid.runtimeWidth, i, xAxis.runtimeMinValue, xAxis.runtimeMaxValue, dataZoom, + var label = ChartHelper.AddAxisLabelObject(i, ChartCached.GetXAxisName(xAxisIndex, i), axisObj.transform, + new Vector2(0, 1), new Vector2(0, 1), new Vector2(1, 0.5f), new Vector2(textWidth, textHeight), xAxis, theme.axis); + + if (i == 0) xAxis.axisLabel.SetRelatedText(label.label, labelWidth); + if (xAxis.axisLabel.autoAlign) + { + label.label.SetAlignment(TextAnchor.MiddleCenter); + } + label.SetPosition(GetLabelXPosition(totalWidth + textWidth / 2 + gapWidth, i, xAxisIndex, xAxis)); + label.SetText(AxisHelper.GetLabelName(xAxis, grid.runtimeWidth, i, xAxis.runtimeMinValue, xAxis.runtimeMaxValue, dataZoom, isPercentStack)); - txt.SetActive(xAxis.show && (xAxis.axisLabel.interval == 0 || i % (xAxis.axisLabel.interval + 1) == 0)); - xAxis.axisLabelTextList.Add(txt); + xAxis.runtimeAxisLabelList.Add(label); totalWidth += labelWidth; } if (xAxis.axisName.show) @@ -807,7 +830,7 @@ namespace XCharts posX = startX - yAxis.axisLabel.margin; } posX += yAxis.offset; - return new Vector3(posX, grid.runtimeY + scaleWid, 0); + return new Vector3(posX, grid.runtimeY + scaleWid, 0) + yAxis.axisLabel.textStyle.offsetv3; } private Vector3 GetLabelXPosition(float scaleWid, int i, int xAxisIndex, XAxis xAxis) @@ -827,7 +850,7 @@ namespace XCharts posY = startY - xAxis.axisLabel.margin - fontSize / 2; } posY += xAxis.offset; - return new Vector3(grid.runtimeX + scaleWid, posY); + return new Vector3(grid.runtimeX + scaleWid, posY) + xAxis.axisLabel.textStyle.offsetv3; } protected virtual void CheckMinMaxValue() diff --git a/Assets/XCharts/Runtime/Internal/Object/ChartLabel.cs b/Assets/XCharts/Runtime/Internal/Object/ChartLabel.cs index 52e02464..0d5aef6d 100644 --- a/Assets/XCharts/Runtime/Internal/Object/ChartLabel.cs +++ b/Assets/XCharts/Runtime/Internal/Object/ChartLabel.cs @@ -19,12 +19,33 @@ namespace XCharts private RectTransform m_LabelRect; private RectTransform m_IconRect; private RectTransform m_ObjectRect; + private Vector3 m_IconOffest; private Image m_IconImage; - public GameObject gameObject { get { return m_GameObject; } } - public Image icon { get { return m_IconImage; } } - public ChartText label { get { return m_LabelText; } } + public GameObject gameObject + { + get { return m_GameObject; } + set + { + m_GameObject = value; + m_ObjectRect = value.GetComponent(); + } + } + public Image icon + { + get { return m_IconImage; } + set { SetIcon(value); } + } + public ChartText label + { + get { return m_LabelText; } + set + { + m_LabelText = value; + if (value != null) m_LabelRect = m_LabelText.gameObject.GetComponent(); + } + } public ChartLabel() { @@ -41,6 +62,11 @@ namespace XCharts m_ObjectRect = labelObj.GetComponent(); } + public void SetAutoSize(bool flag) + { + m_LabelAutoSize = flag; + } + public void SetIcon(Image image) { m_IconImage = image; @@ -60,16 +86,17 @@ namespace XCharts if (m_IconRect != null) m_IconRect.sizeDelta = new Vector3(width, height); } - public void UpdateIcon(IconStyle iconStyle) + public void UpdateIcon(IconStyle iconStyle, Sprite sprite = null) { if (m_IconImage == null) return; if (iconStyle.show) { ChartHelper.SetActive(m_IconImage.gameObject, true); - m_IconImage.sprite = iconStyle.sprite; + m_IconImage.sprite = sprite == null ? iconStyle.sprite : sprite; m_IconImage.color = iconStyle.color; m_IconRect.sizeDelta = new Vector2(iconStyle.width, iconStyle.height); - m_IconImage.transform.localPosition = iconStyle.offset; + m_IconOffest = iconStyle.offset; + AdjustIconPos(); if (iconStyle.layer == IconStyle.Layer.UnderLabel) m_IconRect.SetSiblingIndex(0); else @@ -144,12 +171,40 @@ namespace XCharts if (sizeChange) { m_LabelRect.sizeDelta = newSize; - m_ObjectRect.sizeDelta = newSize; + AdjustIconPos(); } return sizeChange; } + AdjustIconPos(); } return false; } + + private void AdjustIconPos() + { + if (m_IconImage && m_IconImage.sprite != null && m_IconRect) + { + var iconX = 0f; + switch (m_LabelText.text.alignment) + { + case TextAnchor.LowerLeft: + case TextAnchor.UpperLeft: + case TextAnchor.MiddleLeft: + iconX = -m_ObjectRect.sizeDelta.x / 2 - m_IconRect.sizeDelta.x / 2; + break; + case TextAnchor.LowerRight: + case TextAnchor.UpperRight: + case TextAnchor.MiddleRight: + iconX = m_ObjectRect.sizeDelta.x / 2 - m_LabelText.GetPreferredWidth() - m_IconRect.sizeDelta.x / 2; + break; + case TextAnchor.LowerCenter: + case TextAnchor.UpperCenter: + case TextAnchor.MiddleCenter: + iconX = -m_LabelText.GetPreferredWidth() / 2 - m_IconRect.sizeDelta.x / 2; + break; + } + m_IconRect.anchoredPosition = m_IconOffest + new Vector3(iconX, 0); + } + } } } diff --git a/Assets/XCharts/Runtime/Internal/Object/ChartObject.cs b/Assets/XCharts/Runtime/Internal/Object/ChartObject.cs index 6ce5d80e..eb8de951 100644 --- a/Assets/XCharts/Runtime/Internal/Object/ChartObject.cs +++ b/Assets/XCharts/Runtime/Internal/Object/ChartObject.cs @@ -5,7 +5,6 @@ /* */ /************************************************/ -using System; using UnityEngine; namespace XCharts diff --git a/Assets/XCharts/Runtime/Internal/Utility/ChartHelper.cs b/Assets/XCharts/Runtime/Internal/Utility/ChartHelper.cs index fea5c6a3..719cbf1d 100644 --- a/Assets/XCharts/Runtime/Internal/Utility/ChartHelper.cs +++ b/Assets/XCharts/Runtime/Internal/Utility/ChartHelper.cs @@ -247,13 +247,13 @@ namespace XCharts chartText.tmpText.alignment = textStyle.tmpAlignment; chartText.tmpText.richText = true; chartText.tmpText.raycastTarget = false; - chartText.tmpText.enableWordWrapping = false; + chartText.tmpText.enableWordWrapping = textStyle.wrap; #else chartText.text = GetOrAddComponent(txtObj); chartText.text.font = textStyle.font == null ? theme.font : textStyle.font; chartText.text.fontStyle = textStyle.fontStyle; chartText.text.alignment = textStyle.alignment; - chartText.text.horizontalOverflow = HorizontalWrapMode.Overflow; + chartText.text.horizontalOverflow = textStyle.wrap ? HorizontalWrapMode.Wrap : HorizontalWrapMode.Overflow; chartText.text.verticalOverflow = VerticalWrapMode.Overflow; chartText.text.supportRichText = true; chartText.text.raycastTarget = false; @@ -387,7 +387,7 @@ namespace XCharts return ChartHelper.GetOrAddComponent(painterObj); } - public static GameObject AddIcon(string name, Transform parent, float width, float height) + public static Image AddIcon(string name, Transform parent, float width, float height) { var anchorMax = new Vector2(0.5f, 0.5f); var anchorMin = new Vector2(0.5f, 0.5f); @@ -396,7 +396,29 @@ namespace XCharts GameObject iconObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); var img = GetOrAddComponent(iconObj); img.raycastTarget = false; - return iconObj; + return img; + } + + public static ChartLabel AddAxisLabelObject(int index, string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax, + Vector2 pivot, Vector2 sizeDelta, Axis axis, ComponentTheme theme) + { + var textStyle = axis.axisLabel.textStyle; + var iconStyle = axis.iconStyle; + var label = new ChartLabel(); + label.gameObject = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); + + // TODO: 为了兼容旧版本,这里后面版本可以去掉 + var oldText = label.gameObject.GetComponent(); + if (oldText != null) + { + GameObject.DestroyImmediate(oldText); + } + label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme); + label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, iconStyle.width, iconStyle.height); + label.SetAutoSize(false); + label.UpdateIcon(iconStyle, axis.GetIcon(index)); + label.label.SetActive(axis.axisLabel.show && (axis.axisLabel.interval == 0 || index % (axis.axisLabel.interval + 1) == 0)); + return label; } internal static GameObject AddSerieLabel(string name, Transform parent, float width, float height, diff --git a/Assets/XCharts/Runtime/PolarChart.cs b/Assets/XCharts/Runtime/PolarChart.cs index 8d5c1de5..7914bf86 100644 --- a/Assets/XCharts/Runtime/PolarChart.cs +++ b/Assets/XCharts/Runtime/PolarChart.cs @@ -46,6 +46,7 @@ namespace XCharts m_Polars.Clear(); m_RadiusAxes.Clear(); m_AngleAxes.Clear(); + InitComponent(); title.text = "PolarChart"; tooltip.type = Tooltip.Type.Corss; RemoveData(); @@ -121,7 +122,7 @@ namespace XCharts var m_AngleAxis = GetAngleAxis(m_Polar.index); if (m_AngleAxis == null) return; PolarHelper.UpdatePolarCenter(m_Polar, m_ChartPosition, m_ChartWidth, m_ChartHeight); - axis.axisLabelTextList.Clear(); + axis.runtimeAxisLabelList.Clear(); var radius = m_Polar.runtimeRadius; var objName = "axis_radius" + axis.index; var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin, @@ -144,21 +145,18 @@ namespace XCharts { float labelWidth = AxisHelper.GetScaleWidth(axis, radius, i, null); bool inside = axis.axisLabel.inside; - var txt = ChartHelper.AddTextObject(objName + i, axisObj.transform, new Vector2(0.5f, 0.5f), - new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(labelWidth, txtHig), textStyle, - m_Theme.axis); - if (i == 0) axis.axisLabel.SetRelatedText(txt, labelWidth); + var label = ChartHelper.AddAxisLabelObject(i, objName + i, axisObj.transform, new Vector2(0.5f, 0.5f), + new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(labelWidth, txtHig), axis, theme.axis); + if (i == 0) axis.axisLabel.SetRelatedText(label.label, labelWidth); var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); var labelName = AxisHelper.GetLabelName(axis, radius, i, axis.runtimeMinValue, axis.runtimeMaxValue, null, isPercentStack); - txt.SetAlignment(TextAnchor.MiddleCenter); - txt.SetText(labelName); - txt.SetActive(axis.show && - (axis.axisLabel.interval == 0 || i % (axis.axisLabel.interval + 1) == 0)); + label.label.SetAlignment(TextAnchor.MiddleCenter); + label.SetText(labelName); var pos = ChartHelper.GetPos(cenPos, totalWidth, startAngle, true) + tickVetor; - txt.SetLocalPosition(pos); - AxisHelper.AdjustRadiusAxisLabelPos(txt, pos, cenPos, txtHig, Vector3.zero); - axis.axisLabelTextList.Add(txt); + label.SetPosition(pos); + AxisHelper.AdjustRadiusAxisLabelPos(label.label, pos, cenPos, txtHig, Vector3.zero); + axis.runtimeAxisLabelList.Add(label); totalWidth += labelWidth; } @@ -207,13 +205,13 @@ namespace XCharts if (m_Polars == null) return; PolarHelper.UpdatePolarCenter(m_Polar, m_ChartPosition, m_ChartWidth, m_ChartHeight); var radius = m_Polar.runtimeRadius; - axis.axisLabelTextList.Clear(); + axis.runtimeAxisLabelList.Clear(); string objName = "axis_angle" + axis.index; var axisObj = ChartHelper.AddObject(objName, transform, graphAnchorMin, graphAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); axisObj.transform.localPosition = Vector3.zero; - axisObj.SetActive(axis.show && axis.axisLabel.show); + axisObj.SetActive(axis.show); axisObj.hideFlags = chartHideFlags; ChartHelper.HideAllObject(axisObj); var splitNumber = AxisHelper.GetSplitNumber(axis, radius, null); @@ -228,18 +226,18 @@ namespace XCharts { float scaleAngle = AxisHelper.GetScaleWidth(axis, total, i, null); bool inside = axis.axisLabel.inside; - var txt = ChartHelper.AddTextObject(objName + i, axisObj.transform, new Vector2(0.5f, 0.5f), - new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(scaleAngle, txtHig), - axis.axisLabel.textStyle, m_Theme.axis); - txt.SetAlignment(TextAnchor.MiddleCenter); - txt.SetText(AxisHelper.GetLabelName(axis, total, i, axis.runtimeMinValue, axis.runtimeMaxValue, + + var label = ChartHelper.AddAxisLabelObject(i, objName + i, axisObj.transform, new Vector2(0.5f, 0.5f), + new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(scaleAngle, txtHig), axis, theme.axis); + + label.label.SetAlignment(TextAnchor.MiddleCenter); + label.SetText(AxisHelper.GetLabelName(axis, total, i, axis.runtimeMinValue, axis.runtimeMaxValue, null, isPercentStack)); - txt.SetActive(axis.show && (axis.axisLabel.interval == 0 || i % (axis.axisLabel.interval + 1) == 0)); var pos = ChartHelper.GetPos(cenPos, radius + margin, isCategory ? (totalAngle + scaleAngle / 2) : totalAngle, true); - AxisHelper.AdjustCircleLabelPos(txt, pos, cenPos, txtHig, Vector3.zero); - if (i == 0) axis.axisLabel.SetRelatedText(txt, scaleAngle); - axis.axisLabelTextList.Add(txt); + AxisHelper.AdjustCircleLabelPos(label, pos, cenPos, txtHig, Vector3.zero); + if (i == 0) axis.axisLabel.SetRelatedText(label.label, scaleAngle); + axis.runtimeAxisLabelList.Add(label); totalAngle += scaleAngle; }