修复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

@@ -140,8 +140,9 @@ namespace XCharts
return;
}
double tempMinValue = 0;
double tempMaxValue = 0;
double tempMinValue;
double tempMaxValue;
axis.context.needAnimation = Application.isPlaying && axis.animation.show;
chart.GetSeriesMinMaxValue(axis, axisIndex, out tempMinValue, out tempMaxValue);
var dataZoom = chart.GetDataZoomOfAxis(axis);
@@ -152,14 +153,15 @@ namespace XCharts
else
dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue);
}
if (tempMinValue != axis.context.minValue ||
tempMaxValue != axis.context.maxValue ||
if (tempMinValue != axis.context.destMinValue ||
tempMaxValue != axis.context.destMaxValue ||
m_LastInterval != axis.interval ||
m_LastSplitNumber != axis.splitNumber)
{
m_LastSplitNumber = axis.splitNumber;
m_LastInterval = axis.interval;
axis.UpdateMinMaxValue(tempMinValue, tempMaxValue);
axis.UpdateMinMaxValue(tempMinValue, tempMaxValue, axis.context.needAnimation);
axis.context.offset = 0;
axis.context.lastCheckInverse = axis.inverse;
UpdateAxisTickValueList(axis);
@@ -183,6 +185,36 @@ namespace XCharts
chart.RefreshChart();
}
}
if (axis.context.needAnimation && (axis.context.minValue != axis.context.destMinValue || axis.context.maxValue != axis.context.destMaxValue))
{
var duration = axis.animation.duration == 0
? SeriesHelper.GetMinAnimationDuration(chart.series) / 1000f
: axis.animation.duration / 1000f;
var deltaTime = axis.animation.unscaledTime ? Time.unscaledDeltaTime : Time.deltaTime;
var minDiff = axis.context.destMinValue - axis.context.lastMinValue;
var maxDiff = axis.context.destMaxValue - axis.context.lastMaxValue;
var minDelta = minDiff / duration * deltaTime;
var maxDelta = maxDiff / duration * deltaTime;
axis.context.minValue += minDelta;
axis.context.maxValue += maxDelta;
if ((minDiff > 0 && axis.context.minValue > axis.context.destMinValue)
|| (minDiff < 0 && axis.context.minValue < axis.context.destMinValue))
{
axis.context.minValue = axis.context.destMinValue;
axis.context.lastMinValue = axis.context.destMinValue;
}
if ((maxDiff > 0 && axis.context.maxValue > axis.context.destMaxValue)
|| (maxDiff < 0 && axis.context.maxValue < axis.context.destMaxValue))
{
axis.context.maxValue = axis.context.destMaxValue;
axis.context.lastMaxValue = axis.context.destMaxValue;
}
axis.context.minMaxRange = axis.context.maxValue - axis.context.minValue;
UpdateAxisTickValueList(axis);
UpdateAxisLabelText(axis);
chart.RefreshChart();
}
}
internal virtual void UpdateAxisLabelText(Axis axis)
@@ -376,8 +408,8 @@ namespace XCharts
{
var labelWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
var labelName = AxisHelper.GetLabelName(axis, axisLength, i,
axis.context.minValue,
axis.context.maxValue,
axis.context.destMinValue,
axis.context.destMaxValue,
dataZoom, isPercentStack);
var label = ChartHelper.AddAxisLabelObject(splitNumber, i,
@@ -631,7 +663,8 @@ namespace XCharts
minorTickDistance = scaleWidth * axis.GetLogValue(1 + (count + 1) * logRange / minorTickSplitNumber);
tickTotal = lastTickX + minorTickDistance;
}
}else if (lastTickX <= axis.context.zeroX || (i == minorStartIndex && pX > axis.context.zeroX))
}
else if (lastTickX <= axis.context.zeroX || (i == minorStartIndex && pX > axis.context.zeroX))
{
var tickTotal = pX - minorTickDistance;
while (tickTotal > lastTickX)