增加SerieLabel的Border边框相关配置支持

This commit is contained in:
monitor1394
2019-09-06 09:11:46 +08:00
parent 1683bb82d5
commit d216079e78
10 changed files with 17264 additions and 19584 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,9 @@ namespace XCharts
SerializedProperty m_LineWidth = prop.FindPropertyRelative("m_LineWidth"); SerializedProperty m_LineWidth = prop.FindPropertyRelative("m_LineWidth");
SerializedProperty m_LineLength1 = prop.FindPropertyRelative("m_LineLength1"); SerializedProperty m_LineLength1 = prop.FindPropertyRelative("m_LineLength1");
SerializedProperty m_LineLength2 = prop.FindPropertyRelative("m_LineLength2"); SerializedProperty m_LineLength2 = prop.FindPropertyRelative("m_LineLength2");
SerializedProperty m_Border = prop.FindPropertyRelative("m_Border");
SerializedProperty m_BorderWidth = prop.FindPropertyRelative("m_BorderWidth");
SerializedProperty m_BorderColor = prop.FindPropertyRelative("m_BorderColor");
ChartEditorHelper.MakeFoldout(ref drawRect, ref m_SerieLabelToggle, prop, null, show, false); ChartEditorHelper.MakeFoldout(ref drawRect, ref m_SerieLabelToggle, prop, null, show, false);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
@@ -57,6 +60,12 @@ namespace XCharts
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_FontStyle); EditorGUI.PropertyField(drawRect, m_FontStyle);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_Border);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_BorderWidth);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_BorderColor);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_Line); EditorGUI.PropertyField(drawRect, m_Line);
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.PropertyField(drawRect, m_LineWidth); EditorGUI.PropertyField(drawRect, m_LineWidth);
@@ -74,7 +83,7 @@ namespace XCharts
float height = 0; float height = 0;
if (ChartEditorHelper.IsToggle(m_SerieLabelToggle, prop)) if (ChartEditorHelper.IsToggle(m_SerieLabelToggle, prop))
{ {
height += 16 * EditorGUIUtility.singleLineHeight + 15 * EditorGUIUtility.standardVerticalSpacing; height += 19 * EditorGUIUtility.singleLineHeight + 18 * EditorGUIUtility.standardVerticalSpacing;
} }
else else
{ {

View File

@@ -262,10 +262,6 @@ namespace XCharts
{ {
var serieList = m_StackSeries[j]; var serieList = m_StackSeries[j];
m_SeriesCurrHig.Clear(); m_SeriesCurrHig.Clear();
// if (m_SeriesCurrHig.Capacity != serieList[0].dataCount)
// {
// m_SeriesCurrHig.Capacity = serieList[0].dataCount;
// }
for (int n = 0; n < serieList.Count; n++) for (int n = 0; n < serieList.Count; n++)
{ {
Serie serie = serieList[n]; Serie serie = serieList[n];
@@ -278,75 +274,12 @@ namespace XCharts
} }
if (yCategory) DrawYBarSerie(vh, j, seriesCount, serie, serieNameCount, ref m_SeriesCurrHig); if (yCategory) DrawYBarSerie(vh, j, seriesCount, serie, serieNameCount, ref m_SeriesCurrHig);
else DrawXBarSerie(vh, j, seriesCount, serie, serieNameCount, ref m_SeriesCurrHig); else DrawXBarSerie(vh, j, seriesCount, serie, serieNameCount, ref m_SeriesCurrHig);
} }
} }
DrawLabelBackground(vh);
if (yCategory) DrawYTooltipIndicator(vh); if (yCategory) DrawYTooltipIndicator(vh);
else DrawXTooltipIndicator(vh); else DrawXTooltipIndicator(vh);
} }
protected override void OnRefreshLabel()
{
var isYAxis = (m_YAxises[0].show && m_YAxises[0].type == Axis.AxisType.Category)
|| (m_YAxises[1].show && m_YAxises[1].type == Axis.AxisType.Category);
for (int i = 0; i < m_Series.Count; i++)
{
var serie = m_Series.GetSerie(i);
if (serie.type == SerieType.Bar && serie.show)
{
var zeroPos = Vector3.zero;
if (serie.label.position == SerieLabel.Position.Bottom || serie.label.position == SerieLabel.Position.Center)
{
if (isYAxis)
{
var xAxis = m_XAxises[serie.axisIndex];
zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY);
}
else
{
var yAxis = m_YAxises[serie.axisIndex];
zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset);
}
}
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
if (serie.label.show)
{
var pos = serie.dataPoints[j];
switch (serie.label.position)
{
case SerieLabel.Position.Center:
pos = isYAxis ? new Vector3(zeroPos.x + (pos.x - zeroPos.x) / 2, pos.y) :
new Vector3(pos.x, zeroPos.y + (pos.y - zeroPos.y) / 2);
break;
case SerieLabel.Position.Bottom:
pos = isYAxis ? new Vector3(zeroPos.x, pos.y) : new Vector3(pos.x, zeroPos.y);
break;
}
var value = serieData.data[1];
serieData.SetLabelActive(true);
serieData.SetLabelText(ChartCached.FloatToStr(value));
if (isYAxis)
{
if (value >= 0) serieData.SetLabelPosition(new Vector3(pos.x + serie.label.distance, pos.y));
else serieData.SetLabelPosition(new Vector3(pos.x - serie.label.distance, pos.y));
}
else
{
if (value >= 0) serieData.SetLabelPosition(new Vector3(pos.x, pos.y + serie.label.distance));
else serieData.SetLabelPosition(new Vector3(pos.x, pos.y - serie.label.distance));
}
}
else
{
serieData.SetLabelActive(false);
}
}
}
}
}
} }
} }

View File

@@ -656,6 +656,55 @@ namespace XCharts
} }
} }
protected void DrawLabelBackground(VertexHelper vh, Serie serie, SerieData serieData)
{
var labelHalfWid = serieData.GetLabelWidth() / 2;
var labelHalfHig = serieData.GetLabelHeight() / 2;
var centerPos = serieData.labelPosition;
var p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig);
var p2 = new Vector3(centerPos.x + labelHalfWid, centerPos.y + labelHalfHig);
var p3 = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig);
var p4 = new Vector3(centerPos.x - labelHalfWid, centerPos.y - labelHalfHig);
if (serie.label.rotate > 0)
{
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
}
ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, serie.label.backgroundColor);
if (serie.label.border)
{
var borderWid = serie.label.borderWidth;
p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig + borderWid);
p2 = new Vector3(centerPos.x + labelHalfWid + 2 * borderWid, centerPos.y + labelHalfHig + borderWid);
p3 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y + labelHalfHig);
p4 = new Vector3(centerPos.x + labelHalfWid + borderWid, centerPos.y - labelHalfHig - 2 * borderWid);
var p5 = new Vector3(centerPos.x + labelHalfWid, centerPos.y - labelHalfHig - borderWid);
var p6 = new Vector3(centerPos.x - labelHalfWid - 2 * borderWid, centerPos.y - labelHalfHig - borderWid);
var p7 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y - labelHalfHig);
var p8 = new Vector3(centerPos.x - labelHalfWid - borderWid, centerPos.y + labelHalfHig + 2 * borderWid);
if (serie.label.rotate > 0)
{
p1 = ChartHelper.RotateRound(p1, centerPos, Vector3.forward, serie.label.rotate);
p2 = ChartHelper.RotateRound(p2, centerPos, Vector3.forward, serie.label.rotate);
p3 = ChartHelper.RotateRound(p3, centerPos, Vector3.forward, serie.label.rotate);
p4 = ChartHelper.RotateRound(p4, centerPos, Vector3.forward, serie.label.rotate);
p5 = ChartHelper.RotateRound(p5, centerPos, Vector3.forward, serie.label.rotate);
p6 = ChartHelper.RotateRound(p6, centerPos, Vector3.forward, serie.label.rotate);
p7 = ChartHelper.RotateRound(p7, centerPos, Vector3.forward, serie.label.rotate);
p8 = ChartHelper.RotateRound(p8, centerPos, Vector3.forward, serie.label.rotate);
}
ChartHelper.DrawLine(vh, p1, p2, borderWid, serie.label.borderColor);
ChartHelper.DrawLine(vh, p3, p4, borderWid, serie.label.borderColor);
ChartHelper.DrawLine(vh, p5, p6, borderWid, serie.label.borderColor);
ChartHelper.DrawLine(vh, p7, p8, borderWid, serie.label.borderColor);
}
}
private int GetSymbolCricleSegment(float radiu) private int GetSymbolCricleSegment(float radiu)
{ {
int max = 50; int max = 50;

View File

@@ -1096,6 +1096,97 @@ namespace XCharts
} }
} }
protected void DrawLabelBackground(VertexHelper vh)
{
var isYAxis = m_YAxises[0].type == Axis.AxisType.Category
|| m_YAxises[1].type == Axis.AxisType.Category;
for (int n = 0; n < m_Series.Count; n++)
{
var serie = m_Series.GetSerie(n);
if (!serie.show || serie.symbol.type == SerieSymbolType.None) continue;
var zeroPos = Vector3.zero;
if (serie.type == SerieType.Bar)
{
if (serie.label.position == SerieLabel.Position.Bottom || serie.label.position == SerieLabel.Position.Center)
{
if (isYAxis)
{
var xAxis = m_XAxises[serie.axisIndex];
zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY);
}
else
{
var yAxis = m_YAxises[serie.axisIndex];
zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset);
}
}
}
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
if (serie.label.show )
{
var pos = serie.dataPoints[j];
var value = serieData.data[1];
switch (serie.type)
{
case SerieType.Line:
break;
case SerieType.Bar:
switch (serie.label.position)
{
case SerieLabel.Position.Center:
pos = isYAxis ? new Vector3(zeroPos.x + (pos.x - zeroPos.x) / 2, pos.y) :
new Vector3(pos.x, zeroPos.y + (pos.y - zeroPos.y) / 2);
break;
case SerieLabel.Position.Bottom:
pos = isYAxis ? new Vector3(zeroPos.x, pos.y) : new Vector3(pos.x, zeroPos.y);
break;
}
break;
}
var centerPos = isYAxis ? new Vector3(pos.x + (value >= 0 ? 1 : -1) * serie.label.distance, pos.y) :
new Vector3(pos.x, pos.y + (value >= 0 ? 1 : -1) * serie.label.distance);
serieData.labelPosition = centerPos;
DrawLabelBackground(vh, serie, serieData);
}
else
{
serieData.SetLabelActive(false);
}
}
}
}
protected override void OnRefreshLabel()
{
var isYAxis = m_YAxises[0].type == Axis.AxisType.Category
|| m_YAxises[1].type == Axis.AxisType.Category;
for (int i = 0; i < m_Series.Count; i++)
{
var serie = m_Series.GetSerie(i);
if (serie.show)
{
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
if (serie.label.show)
{
var pos = serie.dataPoints[j];
var value = serieData.data[1];
serieData.SetLabelActive(true);
serieData.SetLabelText(ChartCached.FloatToStr(value));
serieData.SetLabelPosition(serieData.labelPosition);
}
else
{
serieData.SetLabelActive(false);
}
}
}
}
}
public override void OnBeginDrag(PointerEventData eventData) public override void OnBeginDrag(PointerEventData eventData)
{ {
Vector2 pos; Vector2 pos;

View File

@@ -53,7 +53,8 @@ namespace XCharts
/// </summary> /// </summary>
public Text labelText { get; private set; } public Text labelText { get; private set; }
public RectTransform labelRect { get; private set; } public RectTransform labelRect { get; private set; }
public Image labelImage { get; private set; } public Vector3 labelPosition{get;set;}
//public Image labelImage { get; private set; }
/// <summary> /// <summary>
/// 是否可以显示Label /// 是否可以显示Label
/// </summary> /// </summary>
@@ -82,7 +83,7 @@ namespace XCharts
m_LabelPaddingLeftRight = paddingLeftRight; m_LabelPaddingLeftRight = paddingLeftRight;
m_LabelPaddingTopBottom = paddingTopBottom; m_LabelPaddingTopBottom = paddingTopBottom;
labelText = labelObj.GetComponentInChildren<Text>(); labelText = labelObj.GetComponentInChildren<Text>();
labelImage = labelObj.GetComponent<Image>(); //labelImage = labelObj.GetComponent<Image>();
labelRect = labelObj.GetComponent<RectTransform>(); labelRect = labelObj.GetComponent<RectTransform>();
} }
@@ -104,10 +105,21 @@ namespace XCharts
labelRect.sizeDelta = new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2, labelRect.sizeDelta = new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2,
labelText.preferredHeight + m_LabelPaddingTopBottom * 2); labelText.preferredHeight + m_LabelPaddingTopBottom * 2);
} }
} }
} }
public float GetLabelWidth()
{
if (labelText) return labelText.preferredWidth + m_LabelPaddingLeftRight * 2;
else return 0;
}
public float GetLabelHeight()
{
if (labelText) return labelText.preferredHeight + m_LabelPaddingTopBottom * 2;
return 0;
}
public void SetLabelPosition(Vector3 position) public void SetLabelPosition(Vector3 position)
{ {
if (m_Label) if (m_Label)

View File

@@ -67,6 +67,9 @@ namespace XCharts
[SerializeField] private float m_LineWidth = 1.0f; [SerializeField] private float m_LineWidth = 1.0f;
[SerializeField] private float m_LineLength1 = 25f; [SerializeField] private float m_LineLength1 = 25f;
[SerializeField] private float m_LineLength2 = 15f; [SerializeField] private float m_LineLength2 = 15f;
[SerializeField] private bool m_Border = true;
[SerializeField] private float m_BorderWidth = 0.5f;
[SerializeField] private Color m_BorderColor = Color.grey;
/// <summary> /// <summary>
/// Whether the label is showed. /// Whether the label is showed.
/// 是否显示文本标签。 /// 是否显示文本标签。
@@ -149,5 +152,20 @@ namespace XCharts
/// 视觉引导线第二段的长度。 /// 视觉引导线第二段的长度。
/// </summary> /// </summary>
public float lineLength2 { get { return m_LineLength2; } set { m_LineLength2 = value; } } public float lineLength2 { get { return m_LineLength2; } set { m_LineLength2 = value; } }
/// <summary>
/// Whether to show border.
/// 是否显示边框。
/// </summary>
public bool border { get { return m_Border; } set { m_Border = value; } }
/// <summary>
/// the width of border.
/// 边框宽度。
/// </summary>
public float borderWidth { get { return m_BorderWidth; } set { m_BorderWidth = value; } }
/// <summary>
/// the color of border.
/// 边框颜色。
/// </summary>
public Color borderColor { get { return m_BorderColor; } set { m_BorderColor = value; } }
} }
} }

View File

@@ -40,6 +40,7 @@ namespace XCharts
{ {
DrawLineChart(vh, false); DrawLineChart(vh, false);
} }
DrawLabelBackground(vh);
} }
private Dictionary<int, List<Serie>> m_StackSeries = new Dictionary<int, List<Serie>>(); private Dictionary<int, List<Serie>> m_StackSeries = new Dictionary<int, List<Serie>>();
@@ -89,6 +90,7 @@ namespace XCharts
for (int n = 0; n < m_Series.Count; n++) for (int n = 0; n < m_Series.Count; n++)
{ {
var serie = m_Series.GetSerie(n); var serie = m_Series.GetSerie(n);
if (serie.type != SerieType.Line) continue;
if (!serie.show || serie.symbol.type == SerieSymbolType.None) continue; if (!serie.show || serie.symbol.type == SerieSymbolType.None) continue;
for (int i = 0; i < serie.dataPoints.Count; i++) for (int i = 0; i < serie.dataPoints.Count; i++)
{ {
@@ -311,7 +313,7 @@ namespace XCharts
isFinish = DrawStepLine(vh, serieIndex, serie, yAxis, lp, np, nnp, i, lineColor, areaColor, areaToColor, zeroPos); isFinish = DrawStepLine(vh, serieIndex, serie, yAxis, lp, np, nnp, i, lineColor, areaColor, areaToColor, zeroPos);
break; break;
} }
if (isFinish)serie.animation.SetDataFinish(i); if (isFinish) serie.animation.SetDataFinish(i);
lp = np; lp = np;
} }
if (!serie.animation.IsFinish()) if (!serie.animation.IsFinish())
@@ -382,7 +384,7 @@ namespace XCharts
bool isStart = false; bool isStart = false;
for (int i = 1; i < segment; i++) for (int i = 1; i < segment; i++)
{ {
var cp = lp + dir1 *(dist * i / segment); var cp = lp + dir1 * (dist * i / segment);
if (serie.animation.CheckDetailBreak(cp, isYAxis)) isBreak = true; if (serie.animation.CheckDetailBreak(cp, isYAxis)) isBreak = true;
var tp1 = cp - dir1v * serie.lineStyle.width; var tp1 = cp - dir1v * serie.lineStyle.width;
var tp2 = cp + dir1v * serie.lineStyle.width; var tp2 = cp + dir1v * serie.lineStyle.width;
@@ -428,12 +430,12 @@ namespace XCharts
if (isYAxis) if (isYAxis)
{ {
if (tp1.y > lastDnPos.y || dataIndex == 1 || IsValue()) smoothPoints.Add(tp1); if (tp1.y > lastDnPos.y || dataIndex == 1 || IsValue()) smoothPoints.Add(tp1);
if (tp2.y < dnPos.y|| IsValue()) smoothDownPoints.Add(tp2); if (tp2.y < dnPos.y || IsValue()) smoothDownPoints.Add(tp2);
} }
else else
{ {
if (tp1.x > lastDnPos.x || dataIndex == 1|| IsValue()) smoothPoints.Add(tp1); if (tp1.x > lastDnPos.x || dataIndex == 1 || IsValue()) smoothPoints.Add(tp1);
if (tp2.x < dnPos.x || dataIndex == 1|| IsValue()) smoothDownPoints.Add(tp2); if (tp2.x < dnPos.x || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2);
} }
} }
else else
@@ -442,7 +444,7 @@ namespace XCharts
{ {
if (!isStart) if (!isStart)
{ {
if ((isYAxis && tp2.y > lastDnPos.y) || (!isYAxis && tp2.x > lastDnPos.x) || dataIndex == 1|| IsValue()) if ((isYAxis && tp2.y > lastDnPos.y) || (!isYAxis && tp2.x > lastDnPos.x) || dataIndex == 1 || IsValue())
{ {
isStart = true; isStart = true;
ChartHelper.DrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor); ChartHelper.DrawPolygon(vh, stPos1, tp1, tp2, stPos2, lineColor);
@@ -461,7 +463,7 @@ namespace XCharts
} }
else else
{ {
if ((isYAxis && tp1.y < dnPos.y) || (!isYAxis && tp1.x < dnPos.x)|| IsValue()) if ((isYAxis && tp1.y < dnPos.y) || (!isYAxis && tp1.x < dnPos.x) || IsValue())
ChartHelper.DrawLine(vh, start, cp, serie.lineStyle.width, lineColor); ChartHelper.DrawLine(vh, start, cp, serie.lineStyle.width, lineColor);
else else
{ {
@@ -475,13 +477,13 @@ namespace XCharts
if (isYAxis) if (isYAxis)
{ {
if (tp1.y < dnPos.y|| IsValue()) smoothPoints.Add(tp1); if (tp1.y < dnPos.y || IsValue()) smoothPoints.Add(tp1);
if (tp2.y > lastDnPos.y || dataIndex == 1|| IsValue()) smoothDownPoints.Add(tp2); if (tp2.y > lastDnPos.y || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2);
} }
else else
{ {
if (tp1.x < dnPos.x|| IsValue()) smoothPoints.Add(tp1); if (tp1.x < dnPos.x || IsValue()) smoothPoints.Add(tp1);
if (tp2.x > lastDnPos.x || dataIndex == 1|| IsValue()) smoothDownPoints.Add(tp2); if (tp2.x > lastDnPos.x || dataIndex == 1 || IsValue()) smoothDownPoints.Add(tp2);
} }
} }
start = cp; start = cp;
@@ -857,8 +859,9 @@ namespace XCharts
{ {
var p1 = lastSmoothPoints[lastCount - 1]; var p1 = lastSmoothPoints[lastCount - 1];
var p2 = lastSmoothPoints[lastSmoothPoints.Count - 1]; var p2 = lastSmoothPoints[lastSmoothPoints.Count - 1];
if (!serie.animation.CheckDetailBreak(p1, isYAxis)){ if (!serie.animation.CheckDetailBreak(p1, isYAxis))
ChartHelper.DrawTriangle(vh, p1, start, p2, areaToColor, areaColor, areaToColor); {
ChartHelper.DrawTriangle(vh, p1, start, p2, areaToColor, areaColor, areaToColor);
} }
} }
} }
@@ -1085,43 +1088,5 @@ namespace XCharts
} }
return true; return true;
} }
protected override void OnRefreshLabel()
{
var isYAxis = m_YAxises[0].type == Axis.AxisType.Category
|| m_YAxises[1].type == Axis.AxisType.Category;
for (int i = 0; i < m_Series.Count; i++)
{
var serie = m_Series.GetSerie(i);
if (serie.type == SerieType.Line && serie.show)
{
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
if (serie.label.show && serie.animation.IsFinish())
{
var pos = serie.dataPoints[j];
var value = serieData.data[1];
serieData.SetLabelActive(true);
serieData.SetLabelText(ChartCached.FloatToStr(value));
if (isYAxis)
{
if (value >= 0) serieData.SetLabelPosition(new Vector3(pos.x + serie.label.distance, pos.y));
else serieData.SetLabelPosition(new Vector3(pos.x - serie.label.distance, pos.y));
}
else
{
if (value >= 0) serieData.SetLabelPosition(new Vector3(pos.x, pos.y + serie.label.distance));
else serieData.SetLabelPosition(new Vector3(pos.x, pos.y - serie.label.distance));
}
}
else
{
serieData.SetLabelActive(false);
}
}
}
}
}
} }
} }

View File

@@ -207,9 +207,27 @@ namespace XCharts
RefreshChart(); RefreshChart();
} }
} }
DrawLabelBackground(vh);
raycastTarget = isClickOffset && isDataHighlight; raycastTarget = isClickOffset && isDataHighlight;
} }
private void DrawLabelBackground(VertexHelper vh)
{
foreach (var serie in m_Series.series)
{
if (serie.type == SerieType.Pie && serie.label.show)
{
foreach (var serieData in serie.data)
{
if (serieData.canShowLabel)
{
DrawLabelBackground(vh, serie, serieData);
}
}
}
}
}
private void DrawLabelLine(VertexHelper vh, Serie serie, PieTempData tempData, float outSideRadius, Vector2 center, float currAngle, Color color) private void DrawLabelLine(VertexHelper vh, Serie serie, PieTempData tempData, float outSideRadius, Vector2 center, float currAngle, Color color)
{ {
if (serie.label.show if (serie.label.show
@@ -403,19 +421,18 @@ namespace XCharts
serieData.labelText.fontSize = fontSize; serieData.labelText.fontSize = fontSize;
serieData.labelText.fontStyle = fontStyle; serieData.labelText.fontStyle = fontStyle;
serieData.labelImage.transform.localEulerAngles = new Vector3(0, 0, rotate); serieData.labelRect.transform.localEulerAngles = new Vector3(0, 0, rotate);
switch (serie.label.position) switch (serie.label.position)
{ {
case SerieLabel.Position.Center: case SerieLabel.Position.Center:
serieData.labelImage.transform.localPosition = tempData.center; serieData.labelPosition = tempData.center;
break; break;
case SerieLabel.Position.Inside: case SerieLabel.Position.Inside:
var labelRadius = offsetRadius + insideRadius + (outsideRadius - insideRadius) / 2; var labelRadius = offsetRadius + insideRadius + (outsideRadius - insideRadius) / 2;
var labelCenter = new Vector2(tempData.center.x + labelRadius * Mathf.Sin(currRad), var labelCenter = new Vector2(tempData.center.x + labelRadius * Mathf.Sin(currRad),
tempData.center.y + labelRadius * Mathf.Cos(currRad)); tempData.center.y + labelRadius * Mathf.Cos(currRad));
serieData.labelImage.transform.localPosition = labelCenter; serieData.labelPosition = labelCenter;
break; break;
case SerieLabel.Position.Outside: case SerieLabel.Position.Outside:
labelRadius = tempData.outsideRadius + serie.label.lineLength1; labelRadius = tempData.outsideRadius + serie.label.lineLength1;
@@ -424,14 +441,15 @@ namespace XCharts
float labelWidth = serieData.labelText.preferredWidth; float labelWidth = serieData.labelText.preferredWidth;
if (currAngle > 180) if (currAngle > 180)
{ {
serieData.labelImage.transform.localPosition = new Vector2(labelCenter.x - serie.label.lineLength2 - 5 - labelWidth / 2, labelCenter.y); serieData.labelPosition = new Vector2(labelCenter.x - serie.label.lineLength2 - 5 - labelWidth / 2, labelCenter.y);
} }
else else
{ {
serieData.labelImage.transform.localPosition = new Vector2(labelCenter.x + serie.label.lineLength2 + 5 + labelWidth / 2, labelCenter.y); serieData.labelPosition = new Vector2(labelCenter.x + serie.label.lineLength2 + 5 + labelWidth / 2, labelCenter.y);
} }
break; break;
} }
serieData.SetLabelPosition(serieData.labelPosition);
} }
else else
{ {

View File

@@ -199,9 +199,9 @@ namespace XCharts
var pivot = new Vector2(0.5f, 0.5f); var pivot = new Vector2(0.5f, 0.5f);
var sizeDelta = (width != 0 && height != 0) ? new Vector2(width, height) : new Vector2(50, fontSize + 2); var sizeDelta = (width != 0 && height != 0) ? new Vector2(width, height) : new Vector2(50, fontSize + 2);
GameObject labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); GameObject labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
var img = GetOrAddComponent<Image>(labelObj); //var img = GetOrAddComponent<Image>(labelObj);
img.color = backgroundColor; //img.color = backgroundColor;
img.transform.localEulerAngles = new Vector3(0, 0, rotate); labelObj.transform.localEulerAngles = new Vector3(0, 0, rotate);
Text txt = AddTextObject("Text", labelObj.transform, font, textColor, TextAnchor.MiddleCenter, Text txt = AddTextObject("Text", labelObj.transform, font, textColor, TextAnchor.MiddleCenter,
anchorMin, anchorMax, pivot, sizeDelta, fontSize, 0, fontStyle); anchorMin, anchorMax, pivot, sizeDelta, fontSize, 0, fontStyle);
txt.text = "Text"; txt.text = "Text";
@@ -694,5 +694,12 @@ namespace XCharts
&& ((y >= start.y && y <= end.y) && ((y >= start.y && y <= end.y)
|| (y >= end.y && y <= start.y)); || (y >= end.y && y <= start.y));
} }
public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
{
Vector3 point = Quaternion.AngleAxis(angle, axis) * (position - center);
Vector3 resultVec3 = center + point;
return resultVec3;
}
} }
} }