暂停Android动画:插值时间问题

时间:2016-07-15 00:45:01

标签: java android android-animation interpolation

我正在制作可以暂停的动画。

因此我已经将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不同。 _(ツ)_ /¯

0 个答案:

没有答案