修复Axis的更新数据时效果不顺畅的问题

This commit is contained in:
monitor1394
2023-11-24 08:29:55 +08:00
parent 1f970cbb36
commit 45be0748aa
20 changed files with 418 additions and 233 deletions

View File

@@ -192,8 +192,6 @@ namespace XCharts.Runtime
var dataChangeDuration = serie.animation.GetChangeDuration();
var dataAddDuration = serie.animation.GetAdditionDuration();
var interactDuration = serie.animation.GetInteractionDuration();
var yMinValue = relativedAxis.context.minValue;
var yMaxValue = relativedAxis.context.maxValue;
var areaColor = ColorUtil.clearColor32;
var areaToColor = ColorUtil.clearColor32;
@@ -219,7 +217,7 @@ namespace XCharts.Runtime
var state = SerieHelper.GetSerieState(serie, serieData);
var itemStyle = SerieHelper.GetItemStyle(serie, serieData, state);
var value = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse);
var relativedValue = serieData.GetCurrData(1, dataAddDuration, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue, serie.animation.unscaledTime);
var relativedValue = serieData.GetCurrData(1, dataAddDuration, dataChangeDuration, relativedAxis.inverse, 0, 0, serie.animation.unscaledTime);
var borderWidth = relativedValue == 0 ? 0 : itemStyle.runtimeBorderWidth;
var borderGap = relativedValue == 0 ? 0 : itemStyle.borderGap;
var borderGapAndWidth = borderWidth + borderGap;

View File

@@ -137,8 +137,6 @@ namespace XCharts.Runtime
var dataChangeDuration = serie.animation.GetChangeDuration();
var dataAddDuration = serie.animation.GetAdditionDuration();
var interactDuration = serie.animation.GetInteractionDuration();
double yMinValue = relativedAxis.context.minValue;
double yMaxValue = relativedAxis.context.maxValue;
var areaColor = ColorUtil.clearColor32;
var areaToColor = ColorUtil.clearColor32;
@@ -163,7 +161,7 @@ namespace XCharts.Runtime
var highlight = serieData.context.highlight || serie.highlight;
var itemStyle = SerieHelper.GetItemStyle(serie, serieData);
var value = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse);
var relativedValue = serieData.GetCurrData(1, dataAddDuration, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue, serie.animation.unscaledTime);
var relativedValue = serieData.GetCurrData(1, dataAddDuration, dataChangeDuration, relativedAxis.inverse, 0, 0, serie.animation.unscaledTime);
var borderWidth = relativedValue == 0 ? 0 : itemStyle.runtimeBorderWidth;
if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting, interactDuration))

View File

@@ -249,7 +249,7 @@ namespace XCharts.Runtime
var isRectSymbol = symbol.type == SymbolType.Rect;
SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state);
var value = serieData.GetCurrData(dimension, dataAddDuration, dataChangeDuration, yAxis.inverse,
yAxis.context.minValue, yAxis.context.maxValue, unscaledTime);
0, 0, unscaledTime);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + 0.5f) * xWidth,
zeroY + (j + 0.5f) * yWidth);

View File

@@ -308,10 +308,10 @@ namespace XCharts.Runtime
/// <param name="axisIndex"></param>
/// <param name="minValue"></param>
/// <param name="maxValue"></param>
public static void GetXMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
bool inverse, out double minValue, out double maxValue, bool isPolar = false, bool filterByDataZoom = true)
public static void GetXMinMaxValue(BaseChart chart, int axisIndex, bool inverse, out double minValue,
out double maxValue, bool isPolar = false, bool filterByDataZoom = true, bool needAnimation = false)
{
GetMinMaxValue(chart, axisIndex, isValueAxis, inverse, false, out minValue, out maxValue, isPolar, filterByDataZoom);
GetMinMaxValue(chart, axisIndex, inverse, false, out minValue, out maxValue, isPolar, filterByDataZoom, needAnimation);
}
/// <summary>
@@ -321,18 +321,17 @@ namespace XCharts.Runtime
/// <param name="axisIndex"></param>
/// <param name="minValue"></param>
/// <param name="maxValue"></param>
public static void GetYMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
bool inverse, out double minValue, out double maxValue, bool isPolar = false, bool filterByDataZoom = true)
public static void GetYMinMaxValue(BaseChart chart, int axisIndex, bool inverse, out double minValue,
out double maxValue, bool isPolar = false, bool filterByDataZoom = true, bool needAnimation = false)
{
GetMinMaxValue(chart, axisIndex, isValueAxis, inverse, true, out minValue, out maxValue, isPolar, filterByDataZoom);
GetMinMaxValue(chart, axisIndex, inverse, true, out minValue, out maxValue, isPolar, filterByDataZoom, needAnimation);
}
private static Dictionary<int, List<Serie>> _stackSeriesForMinMax = new Dictionary<int, List<Serie>>();
private static Dictionary<int, double> _serieTotalValueForMinMax = new Dictionary<int, double>();
private static DataZoom xDataZoom, yDataZoom;
public static void GetMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
public static void GetMinMaxValue(BaseChart chart, int axisIndex,
bool inverse, bool yValue, out double minValue, out double maxValue, bool isPolar = false,
bool filterByDataZoom = true)
bool filterByDataZoom = true, bool needAnimation = false)
{
double min = double.MaxValue;
double max = double.MinValue;
@@ -346,8 +345,8 @@ namespace XCharts.Runtime
if ((isPolar && serie.polarIndex != axisIndex) ||
(!isPolar && serie.yAxisIndex != axisIndex) ||
!serie.show) continue;
var updateDuration = serie.animation.GetChangeDuration();
var dataAddDuration = serie.animation.GetAdditionDuration();
var updateDuration = needAnimation ? serie.animation.GetChangeDuration() : 0;
var dataAddDuration = needAnimation ? serie.animation.GetAdditionDuration() : 0;
var unscaledTime = serie.animation.unscaledTime;
if (isPercentStack && SeriesHelper.IsPercentStack<Bar>(series, serie.serieName))
{
@@ -406,8 +405,8 @@ namespace XCharts.Runtime
}
else
{
var updateDuration = serie.animation.GetChangeDuration();
var dataAddDuration = serie.animation.GetAdditionDuration();
var updateDuration = needAnimation ? serie.animation.GetChangeDuration() : 0;
var dataAddDuration = needAnimation ? serie.animation.GetAdditionDuration() : 0;
var unscaledTime = serie.animation.unscaledTime;
for (int j = 0; j < showData.Count; j++)
{
@@ -420,10 +419,8 @@ namespace XCharts.Runtime
}
else
{
//currData = yValue ? showData[j].GetData(1) : showData[j].GetData(0);
currData = showData[j].GetCurrData(yValue ? 1 : 0, dataAddDuration, updateDuration, unscaledTime, inverse);
}
//if (inverse) currData = -currData;
if (!serie.IsIgnoreValue(showData[j], currData))
_serieTotalValueForMinMax[j] = _serieTotalValueForMinMax[j] + currData;
}
@@ -466,5 +463,18 @@ namespace XCharts.Runtime
}
return max;
}
public static float GetMinAnimationDuration(List<Serie> series)
{
float min = float.MaxValue;
foreach (var serie in series)
{
var changeAnimation = serie.animation.change.duration;
var additionAnimation = serie.animation.addition.duration;
if (changeAnimation != 0 && changeAnimation < min) min = changeAnimation;
if (additionAnimation != 0 && additionAnimation < min) min = additionAnimation;
}
return min;
}
}
}