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.我怎么才能正确地暂停动画

解决问题

这就是诀窍:

但是没有解释为什么我计算的插值与机器人不同。¯_(ツ)_/“”