我正在制作可以暂停的动画。
因此我已经将Animation
类子类化了。
我要覆盖的关键方法是applyTransformation
。动画完成的常规方式是使用插值时间来制作动画。
然而,这不能暂停。
因此我创建了自己的插值时间并使用它来确定动画,因为如果它已暂停,我可以保持这个经过调整的插值准确。
我所做的是跟踪系统时间,测量经过帧之间的距离,并将其作为我的真实插值时间。因为如果它暂停了,那么我会继续更新_lastAccumulatedTime
而不应用插值直到它被取消暂停。
问题是我的价值观和机器人价值观已经关闭!第一个问题是调用applyTransformation
的前2或3次,发送的插值时间为0! (因此我检查了这一点并忽略了徒劳的尝试让我的插值时间与Androids同步通过一个)。
然而,在那之后,我的计算和Androids通过插值时间有时是相同的,有时是不同的。这是一个日志示例(每个空行是一个新的帧调用):
自定义插值0.2762763其插值0.25225225
自定义插值0.37237236其插值0.4024024
自定义插值0.44144145他们的插值0.45345345
自定义插值0.5045045它们的插值0.5045045
自定义插值0.5405405它们的插值0.5555556
自定义插值0.5675676其插值0.6066066
自定义插值0.6156156插值0.6576577
自定义插值0.6696697其插值0.7057057
自定义插值0.7207207它们的插值0.7567568
自定义插值0.7717718它们的插值0.8078078
自定义插值0.8198198其插值0.8588589
自定义插值0.8798799其插值0.9099099
自定义插值0.972973它们的插值0.957958
自定义插值1.024024它们的插值1.0
自定义插值1.078078它们的插值1.0
Theres以完美的1结束,因为我的四舍五入问题。正如你在本案中看到的那样,我以7.8%的差异结束了。当它应该已经完成时它也连续两次调用转换(即两个背靠背1.0调用)??
这是初始化:
public RadialProgressBarAnimator(RadialProgressBar progressBar, float newFillPercent, Callbacks.VoidCallback onSecondTick, Callbacks.VoidCallback onFinish)
{
_lastAccumulatedTime = System.currentTimeMillis();
_accumulatedTickTime = 0;
_oldFillPercent = progressBar.getFillPercent();
_newFillPercent = newFillPercent;
_progressBar = progressBar;
_onFinish = onFinish;
_onSecondTick = onSecondTick;
// Default interpolation is not linear, so set interpolation to linear
setInterpolator(new LinearInterpolator());
}
这是我的覆盖:
@Override
protected void applyTransformation(float interpolatedTime, Transformation transformation)
{
if (_paused || interpolatedTime == 0)
{
_lastAccumulatedTime = System.currentTimeMillis();
return;
}
// Add interpolated time to accumulator and fire onSectionTick callback
// if time has exceeded 1 second
_accumulatedTickTime += System.currentTimeMillis() - _lastAccumulatedTime;
_totalAccumulatedTime += System.currentTimeMillis() - _lastAccumulatedTime;
if (_accumulatedTickTime > TimeConstants.SECOND_IN_MILLIS)
{
_accumulatedTickTime = 0;
if (_onSecondTick != null)
{
_onSecondTick.callback();
}
}
_lastAccumulatedTime = System.currentTimeMillis();
float adjustedInterpolatedTimed = (float)_totalAccumulatedTime / (float)getDuration();
float deltaFillPercent = (_newFillPercent - _oldFillPercent) * adjustedInterpolatedTimed;
Log.d(TAG, " Custom interpolation " + adjustedInterpolatedTimed);
Log.d(TAG, " Their interpolation " + interpolatedTime);
Log.d(TAG, "\n\n ");
float newTimeAdjustedFillPercent = _oldFillPercent + deltaFillPercent;
this._progressBar.setFillPercent(newTimeAdjustedFillPercent);
this._progressBar.requestLayout();
if (newTimeAdjustedFillPercent == _newFillPercent && _onFinish != null)
{
Log.d(TAG, "Animation finished");
}
}
如果你到目前为止一直保持胜利,那就不胜感激!
我的问题是: 1.为什么我的计算和插值时间与Androids不同 2.我怎样才能正确暂停动画?
解决方法
这就是诀窍:
https://stackoverflow.com/a/14829837/3324388
但是没有解释为什么我的计算插值与Androids不同。 _(ツ)_ /¯