修复AxisTime时间轴在有DataZoom缩放时文本显示异常的问题

This commit is contained in:
monitor1394
2025-04-06 22:24:05 +08:00
parent 85b92ca2cc
commit 3818d1213e
2 changed files with 46 additions and 13 deletions

View File

@@ -80,6 +80,8 @@ slug: /changelog
## master ## master
* (2025.04.06) 修复`Axis``Time`时间轴在有`DataZoom`缩放时文本显示异常的问题
* (2025.03.28) 修复`Pie3D``avoidLabelOverlap`不生效的问题
* (2025.03.27) 增加`Legend``itemInactiveOpacity`可设置非激活状态时的颜色透明度 (#343) * (2025.03.27) 增加`Legend``itemInactiveOpacity`可设置非激活状态时的颜色透明度 (#343)
* (2025.03.27) 增加`Axis``onLabelClick`回调事件 * (2025.03.27) 增加`Axis``onLabelClick`回调事件
* (2025.03.26) 增加`Animation``Exchange`排序交换动画 * (2025.03.26) 增加`Animation``Exchange`排序交换动画

View File

@@ -37,9 +37,9 @@ namespace XCharts.Runtime
public static bool IsDateOrTimeRegex(string regex, ref bool date, ref string formatter) public static bool IsDateOrTimeRegex(string regex, ref bool date, ref string formatter)
{ {
if(IsDateOrTimeRegex(regex)) if (IsDateOrTimeRegex(regex))
{ {
if(regex == "date" || regex == "time") if (regex == "date" || regex == "time")
{ {
date = regex == "date"; date = regex == "date";
formatter = ""; formatter = "";
@@ -146,22 +146,30 @@ namespace XCharts.Runtime
/// <param name="splitNumber"></param> /// <param name="splitNumber"></param>
internal static float UpdateTimeAxisDateTimeList(List<double> list, int minTimestamp, int maxTimestamp, int splitNumber) internal static float UpdateTimeAxisDateTimeList(List<double> list, int minTimestamp, int maxTimestamp, int splitNumber)
{ {
var firstValue = list.Count > 0 ? list[0] : 0;
var secondValue = list.Count > 1 ? list[1] : 0;
list.Clear();
var range = maxTimestamp - minTimestamp; var range = maxTimestamp - minTimestamp;
if (range <= 0) return 0; if (range <= 0)
{
list.Clear();
return 0;
}
var dtMin = DateTimeUtil.GetDateTime(minTimestamp); var dtMin = DateTimeUtil.GetDateTime(minTimestamp);
var dtMax = DateTimeUtil.GetDateTime(maxTimestamp); var dtMax = DateTimeUtil.GetDateTime(maxTimestamp);
int tick = 0; int tick = 0;
if (range >= ONE_YEAR * MIN_TIME_SPLIT_NUMBER) if (range >= ONE_YEAR * MIN_TIME_SPLIT_NUMBER)
{ {
var num = splitNumber <= 0 ? GetSplitNumber(range, ONE_YEAR) : Math.Max(range / (splitNumber * ONE_YEAR), 1); var num = splitNumber <= 0 ? GetSplitNumber(range, ONE_YEAR) : Math.Max(range / (splitNumber * ONE_YEAR), 1);
var dtStart = (firstValue == 0 || secondValue == 0 || (minTimestamp > firstValue && minTimestamp > secondValue)) var dtStart = GetDateTime(GetFirstMaxValue(list, minTimestamp));
? (new DateTime(dtMin.Year, dtMin.Month, 1).AddMonths(1))
: (minTimestamp > firstValue ? DateTimeUtil.GetDateTime(secondValue) : DateTimeUtil.GetDateTime(firstValue));
tick = num * 365 * 24 * 3600;
dtStart = new DateTime(dtStart.Year, dtStart.Month, 1); dtStart = new DateTime(dtStart.Year, dtStart.Month, 1);
while (dtStart > dtMin)
{
dtStart = dtStart.AddYears(-num);
}
if (dtStart < dtMin)
{
dtStart = dtStart.AddYears(num);
}
tick = num * 365 * 24 * 3600;
list.Clear();
while (dtStart.Ticks < dtMax.Ticks) while (dtStart.Ticks < dtMax.Ticks)
{ {
list.Add(DateTimeUtil.GetTimestamp(dtStart)); list.Add(DateTimeUtil.GetTimestamp(dtStart));
@@ -171,11 +179,18 @@ namespace XCharts.Runtime
else if (range >= ONE_MONTH * MIN_TIME_SPLIT_NUMBER) else if (range >= ONE_MONTH * MIN_TIME_SPLIT_NUMBER)
{ {
var num = splitNumber <= 0 ? GetSplitNumber(range, ONE_MONTH) : Math.Max(range / (splitNumber * ONE_MONTH), 1); var num = splitNumber <= 0 ? GetSplitNumber(range, ONE_MONTH) : Math.Max(range / (splitNumber * ONE_MONTH), 1);
var dtStart = (firstValue == 0 || secondValue == 0 || (minTimestamp > firstValue && minTimestamp > secondValue)) var dtStart = GetDateTime(GetFirstMaxValue(list, minTimestamp));
? (new DateTime(dtMin.Year, dtMin.Month, 1).AddMonths(1))
: (minTimestamp > firstValue ? DateTimeUtil.GetDateTime(secondValue) : DateTimeUtil.GetDateTime(firstValue));
dtStart = new DateTime(dtStart.Year, dtStart.Month, 1); dtStart = new DateTime(dtStart.Year, dtStart.Month, 1);
while (dtStart > dtMin)
{
dtStart = dtStart.AddMonths(-num);
}
if (dtStart < dtMin)
{
dtStart = dtStart.AddMonths(num);
}
tick = num * 30 * 24 * 3600; tick = num * 30 * 24 * 3600;
list.Clear();
while (dtStart.Ticks < dtMax.Ticks) while (dtStart.Ticks < dtMax.Ticks)
{ {
list.Add(DateTimeUtil.GetTimestamp(dtStart)); list.Add(DateTimeUtil.GetTimestamp(dtStart));
@@ -187,6 +202,7 @@ namespace XCharts.Runtime
tick = GetTickSecond(range, splitNumber, ONE_DAY); tick = GetTickSecond(range, splitNumber, ONE_DAY);
var let = minTimestamp % tick; var let = minTimestamp % tick;
var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick;
list.Clear();
AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
} }
else if (range >= ONE_HOUR * MIN_TIME_SPLIT_NUMBER) else if (range >= ONE_HOUR * MIN_TIME_SPLIT_NUMBER)
@@ -194,6 +210,7 @@ namespace XCharts.Runtime
tick = GetTickSecond(range, splitNumber, ONE_HOUR); tick = GetTickSecond(range, splitNumber, ONE_HOUR);
var let = minTimestamp % tick; var let = minTimestamp % tick;
var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick;
list.Clear();
AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
} }
else if (range >= ONE_MINUTE * MIN_TIME_SPLIT_NUMBER) else if (range >= ONE_MINUTE * MIN_TIME_SPLIT_NUMBER)
@@ -201,6 +218,7 @@ namespace XCharts.Runtime
tick = GetTickSecond(range, splitNumber, ONE_MINUTE); tick = GetTickSecond(range, splitNumber, ONE_MINUTE);
var let = minTimestamp % tick; var let = minTimestamp % tick;
var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick;
list.Clear();
AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
} }
else else
@@ -208,11 +226,24 @@ namespace XCharts.Runtime
tick = GetTickSecond(range, splitNumber, ONE_SECOND); tick = GetTickSecond(range, splitNumber, ONE_SECOND);
var let = minTimestamp % tick; var let = minTimestamp % tick;
var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick;
list.Clear();
AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
} }
return tick; return tick;
} }
private static double GetFirstMaxValue(List<double> list, int minTimestamp)
{
for (int i = 0; i < list.Count; i++)
{
if (list[i] >= minTimestamp)
{
return list[i];
}
}
return minTimestamp;
}
private static int GetSplitNumber(int range, int tickSecond) private static int GetSplitNumber(int range, int tickSecond)
{ {
var num = 1; var num = 1;