Java 暂停Android动画:插值时间问题
我正在制作一个可以暂停的动画 因此,我对Java 暂停Android动画:插值时间问题,java,android,android-animation,interpolation,Java,Android,Android Animation,Interpolation,我正在制作一个可以暂停的动画 因此,我对动画类进行了子类化 我覆盖的关键方法是applyTransformation。制作动画的正常方式是使用插值时间制作动画 但是,这不能暂停 因此,我创建自己的插值时间,并使用它来确定动画,因为如果暂停,我可以保持调整后的插值精确 我所做的是跟踪系统时间,测量经过的帧之间的距离,并将其用作真正的插值时间。因为如果暂停,我会不断更新\u lastAccumeratedTime,而不应用插值,直到其取消暂停 问题是我的价值观和机器人的价值观是关闭的!第一个问题是调
动画类进行了子类化
我覆盖的关键方法是applyTransformation
。制作动画的正常方式是使用插值时间制作动画
但是,这不能暂停
因此,我创建自己的插值时间,并使用它来确定动画,因为如果暂停,我可以保持调整后的插值精确
我所做的是跟踪系统时间,测量经过的帧之间的距离,并将其用作真正的插值时间。因为如果暂停,我会不断更新\u lastAccumeratedTime
,而不应用插值,直到其取消暂停
问题是我的价值观和机器人的价值观是关闭的!第一个问题是调用前2或3次applyTransformation
,发送的插值时间为0!(因此,我检查并忽略了这一点,徒劳地试图让我的插值时间与机器人同步一次)
然而在那之后,我的计算和机器人通过插值的时间有时相同,有时不同。下面是一个日志示例(每个空行都是一个新的帧调用):
自定义插值0.2762763其插值0.25225
自定义插值0.37237236其插值0.4024024
自定义插值0.44144145其插值0.45345
自定义插值0.5045其插值0.5045
自定义插值0.5405其插值0.556
自定义插值0.5675676其插值0.6066
自定义插值0.6156156其插值0.6576577
自定义插值0.6696697其插值0.7057057
自定义插值0.7207其插值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
结果是一个完美的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.为什么我的计算和插值时间与机器人不同
2.我怎么才能正确地暂停动画
解决问题
这就是诀窍:
但是没有解释为什么我计算的插值与机器人不同。¯_(ツ)_/“”