mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-22 08:33:50 +00:00
优化PolarChart的Tooltip
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
;
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user