优化PolarChartTooltip

This commit is contained in:
monitor1394
2020-07-02 09:44:25 +08:00
parent 2d9402a417
commit 16905ee336
5 changed files with 101 additions and 24 deletions

View File

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

View File

@@ -853,7 +853,7 @@ namespace XCharts
public class AngleAxis : Axis
{
[SerializeField] private float m_StartAngle = 90;
/// <summary>
/// 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

View File

@@ -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("<color=#").Append(themeInfo.GetColorStr(serie.index)).Append(">● </color>");
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("<color=#").Append(themeInfo.GetColorStr(serie.index)).Append(">● </color>");
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
{

View File

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

View File

@@ -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<Image>(labelObj);