增加LabelStyleminGap可避免label过于密集

This commit is contained in:
monitor1394
2026-05-22 21:52:22 +08:00
parent 9bca52fbfb
commit f7ccec87d9
4 changed files with 48 additions and 0 deletions

View File

@@ -81,6 +81,7 @@ slug: /changelog
## master ## master
* (2026.05.22) 增加`LabelStyle``minGap`可避免`label`过于密集
* (2026.05.17) 修复`DataZoom`点击时指示区域不准的问题 * (2026.05.17) 修复`DataZoom`点击时指示区域不准的问题
* (2026.05.17) 增加`Legend``Width``Height`可设置固定宽高 * (2026.05.17) 增加`Legend``Width``Height`可设置固定宽高
* (2026.05.17) 修复`Serie``EndLabel``Y`轴是`MinMax`类型时显示的数值不对的问题 * (2026.05.17) 修复`Serie``EndLabel``Y`轴是`MinMax`类型时显示的数值不对的问题

View File

@@ -26,6 +26,7 @@ namespace XCharts.Editor
PropertyField(prop, "m_Height"); PropertyField(prop, "m_Height");
PropertyField(prop, "m_FixedX"); PropertyField(prop, "m_FixedX");
PropertyField(prop, "m_FixedY"); PropertyField(prop, "m_FixedY");
PropertyField(prop, "m_MinGap");
PropertyField(prop, "m_Icon"); PropertyField(prop, "m_Icon");
PropertyField(prop, "m_Background"); PropertyField(prop, "m_Background");
PropertyField(prop, "m_TextStyle"); PropertyField(prop, "m_TextStyle");

View File

@@ -82,6 +82,7 @@ namespace XCharts.Runtime
[SerializeField] protected float m_Height = 0; [SerializeField] protected float m_Height = 0;
[SerializeField][Since("v3.15.0")] protected float m_FixedX = 0; [SerializeField][Since("v3.15.0")] protected float m_FixedX = 0;
[SerializeField][Since("v3.15.0")] protected float m_FixedY = 0; [SerializeField][Since("v3.15.0")] protected float m_FixedY = 0;
[SerializeField][Since("v3.16.0")] protected float m_MinGap = 0;
[SerializeField] protected IconStyle m_Icon = new IconStyle(); [SerializeField] protected IconStyle m_Icon = new IconStyle();
[SerializeField] protected ImageStyle m_Background = new ImageStyle(); [SerializeField] protected ImageStyle m_Background = new ImageStyle();
@@ -308,6 +309,16 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetStruct(ref m_FixedY, value)) SetComponentDirty(); } set { if (PropertyUtil.SetStruct(ref m_FixedY, value)) SetComponentDirty(); }
} }
/// <summary> /// <summary>
/// the gap between label and the previous label. When the distance to the previous label is less than this value,
/// the label with smaller y value will be hidden. Default is 0, which means this function is turned off.
/// 和上一个标签的最小间距。当和上一个标签的距离小于该值时隐藏对应y值较小的标签。默认为0不开启该功能。
/// </summary>
public float minGap
{
get { return m_MinGap; }
set { if (PropertyUtil.SetStruct(ref m_MinGap, value)) SetComponentDirty(); }
}
/// <summary>
/// the sytle of background. /// the sytle of background.
/// ||背景图样式。 /// ||背景图样式。
/// </summary> /// </summary>

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
@@ -507,6 +508,9 @@ namespace XCharts.Runtime
var needCheck = serie.context.dataIndexs.Count > 0; var needCheck = serie.context.dataIndexs.Count > 0;
var allLabelZeroPosition = true; var allLabelZeroPosition = true;
var anyLabelActive = false; var anyLabelActive = false;
SerieData lastActiveLabelSerieData = null;
var lastActiveLabelPos = Vector3.zero;
double lastActiveLabelValue = 0;
foreach (var serieData in serie.data) foreach (var serieData in serie.data)
{ {
if (serieData.labelObject == null && serieData.context.dataLabels.Count <= 0) if (serieData.labelObject == null && serieData.context.dataLabels.Count <= 0)
@@ -573,6 +577,37 @@ namespace XCharts.Runtime
currLabel, color, chart); currLabel, color, chart);
var labelPos = UpdateLabelPosition(serieData, currLabel); var labelPos = UpdateLabelPosition(serieData, currLabel);
var active = currLabel.show && !isIgnore && !serie.IsMinShowLabelValue(value); var active = currLabel.show && !isIgnore && !serie.IsMinShowLabelValue(value);
if (active && currLabel.minGap > 0 && lastActiveLabelSerieData != null)
{
var dist = Mathf.Abs(labelPos.x - lastActiveLabelPos.x);
if (dist < currLabel.minGap)
{
var currValue = serieData.GetData(1);
if (Math.Abs(currValue) >= Math.Abs(lastActiveLabelValue))
{
lastActiveLabelSerieData.SetLabelActive(false);
lastActiveLabelSerieData = serieData;
lastActiveLabelPos = labelPos;
lastActiveLabelValue = currValue;
}
else
{
active = false;
}
}
else
{
lastActiveLabelSerieData = serieData;
lastActiveLabelPos = labelPos;
lastActiveLabelValue = serieData.GetData(1);
}
}
else if (active)
{
lastActiveLabelSerieData = serieData;
lastActiveLabelPos = labelPos;
lastActiveLabelValue = serieData.GetData(1);
}
if (active) if (active)
{ {
anyLabelActive = true; anyLabelActive = true;