mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-28 03:58:49 +00:00
优化PolarChart的Tooltip
This commit is contained in:
@@ -38,11 +38,12 @@ namespace XCharts.Examples
|
|||||||
void AddData()
|
void AddData()
|
||||||
{
|
{
|
||||||
chart.RemoveData();
|
chart.RemoveData();
|
||||||
|
chart.tooltip.type = Tooltip.Type.Corss;
|
||||||
chart.angleAxis.type = Axis.AxisType.Value;
|
chart.angleAxis.type = Axis.AxisType.Value;
|
||||||
chart.angleAxis.minMaxType = Axis.AxisMinMaxType.Custom;
|
chart.angleAxis.minMaxType = Axis.AxisMinMaxType.Custom;
|
||||||
chart.angleAxis.min = 0;
|
chart.angleAxis.min = 0;
|
||||||
chart.angleAxis.max = 360;
|
chart.angleAxis.max = 360;
|
||||||
chart.angleAxis.startAngle = Random.Range(0,90);
|
chart.angleAxis.startAngle = Random.Range(0, 90);
|
||||||
chart.AddSerie(SerieType.Line, "line1");
|
chart.AddSerie(SerieType.Line, "line1");
|
||||||
|
|
||||||
var rate = Random.Range(1, 4);
|
var rate = Random.Range(1, 4);
|
||||||
|
|||||||
@@ -187,34 +187,68 @@ namespace XCharts
|
|||||||
{
|
{
|
||||||
var sb = ChartHelper.sb;
|
var sb = ChartHelper.sb;
|
||||||
sb.Length = 0;
|
sb.Length = 0;
|
||||||
|
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;
|
var angle = angleAxis.clockwise ? tooltip.runtimeAngle : 360 - tooltip.runtimeAngle;
|
||||||
sb.Append(angle).Append("\n");
|
title = ChartCached.FloatToStr(angle);
|
||||||
|
}
|
||||||
foreach (var serie in series.list)
|
foreach (var serie in series.list)
|
||||||
{
|
{
|
||||||
if (serie.show && IsSelectedSerie(tooltip, serie.index))
|
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];
|
var dataIndexList = tooltip.runtimeSerieIndex[serie.index];
|
||||||
|
|
||||||
for (int i = 0; i < dataIndexList.Count; i++)
|
for (int i = 0; i < dataIndexList.Count; i++)
|
||||||
{
|
{
|
||||||
var dataIndex = dataIndexList[i];
|
var dataIndex = dataIndexList[i];
|
||||||
var serieData = serie.GetSerieData(dataIndex);
|
var serieData = serie.GetSerieData(dataIndex);
|
||||||
|
var itemFormatter = GetItemFormatter(tooltip, serie, serieData);
|
||||||
var numericFormatter = GetItemNumericFormatter(tooltip, serie, serieData);
|
var numericFormatter = GetItemNumericFormatter(tooltip, serie, serieData);
|
||||||
float xValue, yValue;
|
float xValue, yValue;
|
||||||
serie.GetXYData(dataIndex, null, out xValue, out yValue);
|
serie.GetXYData(dataIndex, null, out xValue, out yValue);
|
||||||
|
if (string.IsNullOrEmpty(itemFormatter))
|
||||||
|
{
|
||||||
sb.Append("<color=#").Append(themeInfo.GetColorStr(serie.index)).Append(">● </color>");
|
sb.Append("<color=#").Append(themeInfo.GetColorStr(serie.index)).Append(">● </color>");
|
||||||
if (!string.IsNullOrEmpty(serie.name))
|
if (!string.IsNullOrEmpty(serie.name))
|
||||||
sb.Append(serie.name).Append(": ");
|
sb.Append(serie.name).Append(": ");
|
||||||
sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter));
|
sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter));
|
||||||
if (i != dataIndexList.Count - 1)
|
if (i != dataIndexList.Count - 1)
|
||||||
{
|
{
|
||||||
sb.Append("\n");
|
sb.Append(FormatterHelper.PH_NN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.Append("\n");
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sb.ToString().Trim();
|
sb.Append(FormatterHelper.PH_NN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(title))
|
||||||
|
{
|
||||||
|
return FormatterHelper.TrimAndReplaceLine(sb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title = FormatterHelper.TrimAndReplaceLine(title);
|
||||||
|
return title + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace XCharts
|
|||||||
InitRadiusAxis(m_RadiusAxis);
|
InitRadiusAxis(m_RadiusAxis);
|
||||||
InitAngleAxis(m_AngleAxis);
|
InitAngleAxis(m_AngleAxis);
|
||||||
m_Tooltip.UpdateToTop();
|
m_Tooltip.UpdateToTop();
|
||||||
|
m_Tooltip.runtimeAngle = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@ namespace XCharts
|
|||||||
{
|
{
|
||||||
base.Reset();
|
base.Reset();
|
||||||
m_Title.text = "PolarChart";
|
m_Title.text = "PolarChart";
|
||||||
m_Tooltip.type = Tooltip.Type.Line;
|
m_Tooltip.type = Tooltip.Type.Corss;
|
||||||
RemoveData();
|
RemoveData();
|
||||||
ResetValuePolar();
|
ResetValuePolar();
|
||||||
Awake();
|
Awake();
|
||||||
@@ -214,9 +215,10 @@ namespace XCharts
|
|||||||
}
|
}
|
||||||
if (m_Tooltip.runtimeGameObject)
|
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;
|
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.SetTooltipLabel(labelObj);
|
||||||
axis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor);
|
axis.SetTooltipLabelColor(m_ThemeInfo.tooltipBackgroundColor, m_ThemeInfo.tooltipTextColor);
|
||||||
axis.SetTooltipLabelActive(axis.show && m_Tooltip.show && m_Tooltip.type == Tooltip.Type.Corss);
|
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;
|
if (m_Tooltip.runtimeAngle < 0) return;
|
||||||
var lineColor = TooltipHelper.GetLineColor(tooltip, m_ThemeInfo);
|
var lineColor = TooltipHelper.GetLineColor(tooltip, m_ThemeInfo);
|
||||||
var cenPos = m_Polar.runtimeCenterPos;
|
var cenPos = m_Polar.runtimeCenterPos;
|
||||||
|
var radius = m_Polar.runtimeRadius;
|
||||||
var sp = m_Polar.runtimeCenterPos;
|
var sp = m_Polar.runtimeCenterPos;
|
||||||
var tooltipAngle = m_Tooltip.runtimeAngle + m_AngleAxis.runtimeStartAngle;
|
var tooltipAngle = m_Tooltip.runtimeAngle + m_AngleAxis.runtimeStartAngle;
|
||||||
var ep = ChartHelper.GetPos(sp, m_Polar.runtimeRadius, tooltipAngle, true);
|
var ep = ChartHelper.GetPos(sp, radius, tooltipAngle, true);
|
||||||
ChartDrawer.DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor);
|
|
||||||
if (m_Tooltip.type == Tooltip.Type.Corss)
|
switch (m_Tooltip.type)
|
||||||
{
|
{
|
||||||
|
case Tooltip.Type.Corss:
|
||||||
|
ChartDrawer.DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor);
|
||||||
var dist = Vector2.Distance(pointerPos, cenPos);
|
var dist = Vector2.Distance(pointerPos, cenPos);
|
||||||
if (dist > m_Polar.runtimeRadius) dist = m_Polar.runtimeRadius;
|
if (dist > radius) dist = radius;
|
||||||
var outsideRaidus = dist + m_Tooltip.lineStyle.width * 2;
|
var outsideRaidus = dist + m_Tooltip.lineStyle.width * 2;
|
||||||
ChartDrawer.DrawDoughnut(vh, cenPos, dist, outsideRaidus, lineColor, Color.clear);
|
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.ClearSerieDataIndex();
|
||||||
m_Tooltip.SetActive(false);
|
m_Tooltip.SetActive(false);
|
||||||
|
m_AngleAxis.SetTooltipLabelActive(false);
|
||||||
|
m_RadiusAxis.SetTooltipLabelActive(false);
|
||||||
RefreshChart();
|
RefreshChart();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -594,8 +608,31 @@ namespace XCharts
|
|||||||
{
|
{
|
||||||
var content = TooltipHelper.GetPolarFormatterContent(m_Tooltip, m_Series, m_ThemeInfo, m_AngleAxis);
|
var content = TooltipHelper.GetPolarFormatterContent(m_Tooltip, m_Series, m_ThemeInfo, m_AngleAxis);
|
||||||
TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
|
TooltipHelper.SetContentAndPosition(tooltip, content, chartRect);
|
||||||
|
UdpateTooltipLabel();
|
||||||
}
|
}
|
||||||
m_Tooltip.SetActive(showTooltip);
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
;
|
||||||
@@ -286,6 +286,11 @@ namespace XCharts
|
|||||||
var anchorMax = new Vector2(0, 0);
|
var anchorMax = new Vector2(0, 0);
|
||||||
var anchorMin = new Vector2(0, 0);
|
var anchorMin = new Vector2(0, 0);
|
||||||
var sizeDelta = new Vector2(100, 50);
|
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);
|
GameObject labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
|
||||||
labelObj.transform.localPosition = Vector3.zero;
|
labelObj.transform.localPosition = Vector3.zero;
|
||||||
var img = GetOrAddComponent<Image>(labelObj);
|
var img = GetOrAddComponent<Image>(labelObj);
|
||||||
|
|||||||
Reference in New Issue
Block a user