From 16905ee336773b85fe50227ce71685d24a49773c Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Thu, 2 Jul 2020 09:44:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`PolarChart`=E7=9A=84`Tooltip?= =?UTF-8?q?`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/Runtime/Example80_Polar.cs | 3 +- Runtime/Component/Main/Axis.cs | 4 +- Runtime/Internal/Helper/TooltipHelper.cs | 56 ++++++++++++++++++----- Runtime/PolarChart.cs | 57 +++++++++++++++++++----- Runtime/Utility/ChartHelper.cs | 5 +++ 5 files changed, 101 insertions(+), 24 deletions(-) diff --git a/Examples/Runtime/Example80_Polar.cs b/Examples/Runtime/Example80_Polar.cs index de71f0d2..e644786b 100644 --- a/Examples/Runtime/Example80_Polar.cs +++ b/Examples/Runtime/Example80_Polar.cs @@ -38,11 +38,12 @@ namespace XCharts.Examples void AddData() { chart.RemoveData(); + chart.tooltip.type = Tooltip.Type.Corss; chart.angleAxis.type = Axis.AxisType.Value; chart.angleAxis.minMaxType = Axis.AxisMinMaxType.Custom; chart.angleAxis.min = 0; chart.angleAxis.max = 360; - chart.angleAxis.startAngle = Random.Range(0,90); + chart.angleAxis.startAngle = Random.Range(0, 90); chart.AddSerie(SerieType.Line, "line1"); var rate = Random.Range(1, 4); diff --git a/Runtime/Component/Main/Axis.cs b/Runtime/Component/Main/Axis.cs index 6aa7063a..e7916d7e 100644 --- a/Runtime/Component/Main/Axis.cs +++ b/Runtime/Component/Main/Axis.cs @@ -853,7 +853,7 @@ namespace XCharts public class AngleAxis : Axis { [SerializeField] private float m_StartAngle = 90; - + /// /// Starting angle of axis. 90 degrees by default, standing for top position of center. 0 degree stands for right position of center. /// 起始刻度的角度,默认为 90 度,即圆心的正上方。0 度为圆心的正右方。 @@ -863,7 +863,7 @@ namespace XCharts get { return m_StartAngle; } set { if (PropertyUtility.SetStruct(ref m_StartAngle, value)) SetAllDirty(); } } - + public float runtimeStartAngle { get; set; } public static AngleAxis defaultAngleAxis diff --git a/Runtime/Internal/Helper/TooltipHelper.cs b/Runtime/Internal/Helper/TooltipHelper.cs index 1556287b..f1deb979 100644 --- a/Runtime/Internal/Helper/TooltipHelper.cs +++ b/Runtime/Internal/Helper/TooltipHelper.cs @@ -187,34 +187,68 @@ namespace XCharts { var sb = ChartHelper.sb; sb.Length = 0; - var angle = angleAxis.clockwise ? tooltip.runtimeAngle : 360 - tooltip.runtimeAngle; - sb.Append(angle).Append("\n"); + var title = tooltip.titleFormatter; + var formatTitle = !string.IsNullOrEmpty(title); + if ("{i}".Equals(tooltip.titleFormatter)) + { + title = string.Empty; + formatTitle = false; + } + else if (string.IsNullOrEmpty(title)) + { + var angle = angleAxis.clockwise ? tooltip.runtimeAngle : 360 - tooltip.runtimeAngle; + title = ChartCached.FloatToStr(angle); + } foreach (var serie in series.list) { if (serie.show && IsSelectedSerie(tooltip, serie.index)) { + if (formatTitle) + { + FormatterHelper.ReplaceContent(ref title, 0, tooltip.numericFormatter, serie, series, themeInfo, null, null); + } var dataIndexList = tooltip.runtimeSerieIndex[serie.index]; + for (int i = 0; i < dataIndexList.Count; i++) { var dataIndex = dataIndexList[i]; var serieData = serie.GetSerieData(dataIndex); + var itemFormatter = GetItemFormatter(tooltip, serie, serieData); var numericFormatter = GetItemNumericFormatter(tooltip, serie, serieData); float xValue, yValue; serie.GetXYData(dataIndex, null, out xValue, out yValue); - - sb.Append("● "); - if (!string.IsNullOrEmpty(serie.name)) - sb.Append(serie.name).Append(": "); - sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter)); - if (i != dataIndexList.Count - 1) + if (string.IsNullOrEmpty(itemFormatter)) { - sb.Append("\n"); + sb.Append("● "); + if (!string.IsNullOrEmpty(serie.name)) + sb.Append(serie.name).Append(": "); + sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter)); + if (i != dataIndexList.Count - 1) + { + sb.Append(FormatterHelper.PH_NN); + } + } + else + { + string content = itemFormatter; + FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, series, themeInfo, null, null); + var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar || serie.type == SerieType.Ring ? dataIndex : serie.index; + sb.Append(ChartCached.ColorToDotStr(themeInfo.GetColor(dotColorIndex))); + sb.Append(content); } } - sb.Append("\n"); + sb.Append(FormatterHelper.PH_NN); } } - return sb.ToString().Trim(); + if (string.IsNullOrEmpty(title)) + { + return FormatterHelper.TrimAndReplaceLine(sb); + } + else + { + title = FormatterHelper.TrimAndReplaceLine(title); + return title + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb); + } } else { diff --git a/Runtime/PolarChart.cs b/Runtime/PolarChart.cs index 48d58072..b3886ffa 100644 --- a/Runtime/PolarChart.cs +++ b/Runtime/PolarChart.cs @@ -31,6 +31,7 @@ namespace XCharts InitRadiusAxis(m_RadiusAxis); InitAngleAxis(m_AngleAxis); m_Tooltip.UpdateToTop(); + m_Tooltip.runtimeAngle = -1; } @@ -39,7 +40,7 @@ namespace XCharts { base.Reset(); m_Title.text = "PolarChart"; - m_Tooltip.type = Tooltip.Type.Line; + m_Tooltip.type = Tooltip.Type.Corss; RemoveData(); ResetValuePolar(); Awake(); @@ -214,9 +215,10 @@ namespace XCharts } if (m_Tooltip.runtimeGameObject) { - Vector2 privot = new Vector2(0.5f, 1); + Vector2 privot = new Vector2(0.5f, 0.5f); var labelParent = m_Tooltip.runtimeGameObject.transform; - GameObject labelObj = ChartHelper.AddTooltipLabel(ChartCached.GetAxisTooltipLabel(objName), labelParent, m_ThemeInfo.font, privot); + GameObject labelObj = ChartHelper.AddTooltipLabel(ChartCached.GetAxisTooltipLabel(objName), labelParent, + m_ThemeInfo.font, privot, privot, privot, new Vector2(10, txtHig)); axis.SetTooltipLabel(labelObj); axis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor); axis.SetTooltipLabelActive(axis.show && m_Tooltip.show && m_Tooltip.type == Tooltip.Type.Corss); @@ -471,16 +473,26 @@ namespace XCharts if (m_Tooltip.runtimeAngle < 0) return; var lineColor = TooltipHelper.GetLineColor(tooltip, m_ThemeInfo); var cenPos = m_Polar.runtimeCenterPos; + var radius = m_Polar.runtimeRadius; var sp = m_Polar.runtimeCenterPos; var tooltipAngle = m_Tooltip.runtimeAngle + m_AngleAxis.runtimeStartAngle; - var ep = ChartHelper.GetPos(sp, m_Polar.runtimeRadius, tooltipAngle, true); - ChartDrawer.DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); - if (m_Tooltip.type == Tooltip.Type.Corss) + var ep = ChartHelper.GetPos(sp, radius, tooltipAngle, true); + + switch (m_Tooltip.type) { - var dist = Vector2.Distance(pointerPos, cenPos); - if (dist > m_Polar.runtimeRadius) dist = m_Polar.runtimeRadius; - var outsideRaidus = dist + m_Tooltip.lineStyle.width * 2; - ChartDrawer.DrawDoughnut(vh, cenPos, dist, outsideRaidus, lineColor, Color.clear); + case Tooltip.Type.Corss: + ChartDrawer.DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); + var dist = Vector2.Distance(pointerPos, cenPos); + if (dist > radius) dist = radius; + var outsideRaidus = dist + m_Tooltip.lineStyle.width * 2; + ChartDrawer.DrawDoughnut(vh, cenPos, dist, outsideRaidus, lineColor, Color.clear); + break; + case Tooltip.Type.Line: + ChartDrawer.DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); + break; + case Tooltip.Type.Shadow: + ChartDrawer.DrawSector(vh, cenPos, radius, lineColor, tooltipAngle - 2, tooltipAngle + 2, m_Settings.cicleSmoothness); + break; } } @@ -521,6 +533,8 @@ namespace XCharts } m_Tooltip.ClearSerieDataIndex(); m_Tooltip.SetActive(false); + m_AngleAxis.SetTooltipLabelActive(false); + m_RadiusAxis.SetTooltipLabelActive(false); RefreshChart(); } return; @@ -594,8 +608,31 @@ namespace XCharts { var content = TooltipHelper.GetPolarFormatterContent(m_Tooltip, m_Series, m_ThemeInfo, m_AngleAxis); TooltipHelper.SetContentAndPosition(tooltip, content, chartRect); + UdpateTooltipLabel(); } m_Tooltip.SetActive(showTooltip); } + + private void UdpateTooltipLabel() + { + if (m_Tooltip.type != Tooltip.Type.Corss) return; + var cenPos = m_Polar.runtimeCenterPos; + var radius = m_Polar.runtimeRadius; + m_AngleAxis.SetTooltipLabelActive(true); + m_RadiusAxis.SetTooltipLabelActive(true); + m_AngleAxis.UpdateTooptipLabelText(ChartCached.FloatToStr(m_Tooltip.runtimeAngle)); + var tooltipAngle = m_Tooltip.runtimeAngle + m_AngleAxis.runtimeStartAngle; + var ep = ChartHelper.GetPos(cenPos, radius + 5, tooltipAngle, true); + m_AngleAxis.UpdateTooltipLabelPos(ep); + + var dist = Vector2.Distance(pointerPos, cenPos); + if (dist > radius) dist = radius; + float min = m_RadiusAxis.runtimeMinValue; + float max = m_RadiusAxis.runtimeMaxValue; + var value = min + dist / radius * m_RadiusAxis.runtimeMinMaxRange; + m_RadiusAxis.UpdateTooptipLabelText(ChartCached.FloatToStr(value)); + m_RadiusAxis.UpdateTooltipLabelPos(ChartHelper.GetPos(cenPos, dist, m_AngleAxis.runtimeStartAngle, true)); + } } } +; \ No newline at end of file diff --git a/Runtime/Utility/ChartHelper.cs b/Runtime/Utility/ChartHelper.cs index 1f7cc387..fb54b384 100644 --- a/Runtime/Utility/ChartHelper.cs +++ b/Runtime/Utility/ChartHelper.cs @@ -286,6 +286,11 @@ namespace XCharts var anchorMax = new Vector2(0, 0); var anchorMin = new Vector2(0, 0); var sizeDelta = new Vector2(100, 50); + return AddTooltipLabel(name, parent, font, pivot, anchorMin, anchorMax, sizeDelta); + } + + internal static GameObject AddTooltipLabel(string name, Transform parent, Font font, Vector2 pivot, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta) + { GameObject labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); labelObj.transform.localPosition = Vector3.zero; var img = GetOrAddComponent(labelObj);