如何避免 Animator 动画的加速/减速?

Posted

技术标签:

【中文标题】如何避免 Animator 动画的加速/减速?【英文标题】:How can I avoid acceleration/deceleration on Animator animations? 【发布时间】:2019-01-16 03:06:32 【问题描述】:

我使用以下代码创建了一系列(最多 4 个)动画。它们都是同时对几个 ImageView 的简单翻译。

在一个动画“帧”(即所有视图的移动)之后,onAnimationEnd 调用下一帧。

问题是:每次调用 onAnimationEnd 后都会有短暂但明显的延迟。看起来有翻译的自动加速和减速以使其看起来更自然,但在这种情况下这是不需要的。 有没有办法避免这种情况?

提前致谢!

private void animateFrame(final int frame) 

    List<Animator> allAnimations = new ArrayList<>();
    AnimatorSet s = new AnimatorSet();

    for (int p = 0; p < playerImages.size(); p++) 

        Animator animation = ObjectAnimator.ofFloat(playerImages.get(p), "translationX", playerPositions[frame][0][p] * factorX);

        allAnimations.add(animation);
        ObjectAnimator animation2 = ObjectAnimator.ofFloat(playerImages.get(p), "translationY", playerPositions[frame][1][p] * factorY);
        allAnimations.add(animation2);
        Log.d(TAG, "onClick: MOVING PLAYER " + p + " TO: " + playerPositions[frame][0][p] + "/" + playerPositions[frame][1][p]);

        if (playerPositions[frame][0][p] != 0) 
            s.playTogether(allAnimations);

            s.setDuration(durations[frame - 1]);
            s.start();

            s.addListener(new Animator.AnimatorListener() 
                @Override
                public void onAnimationStart(Animator animator) 

                

                @Override
                public void onAnimationEnd(Animator animator) 
                    animateFrame(frame+1);
                

                @Override
                public void onAnimationCancel(Animator animator) 

                

                @Override
                public void onAnimationRepeat(Animator animator) 

                
            );

        
    


【问题讨论】:

【参考方案1】:

引用Property Animation Overview

插值器定义如何将动画中的特定值计算为时间的函数。例如,您可以指定动画在整个动画中线性发生,这意味着动画在整个时间均匀移动,或者您可以指定动画使用非线性时间,例如,在开始或结束时使用加速或减速动画。

属性动画的默认插值器是AccelerateDecelerateInterpolator。但是您可以设置另一个插值器(任何实现TimeInterpolator 的类)。根据您的问题,我认为您正在寻找LinearInterpolator

animation.setInterpolator(new LinearInterpolator());

【讨论】:

以上是关于如何避免 Animator 动画的加速/减速?的主要内容,如果未能解决你的问题,请参考以下文章

初识属性动画——使用Animator创建动画

让View具有减速效果的动画——FlingAnimation

Java动画 重力弹球 如鹏游戏引擎 精灵 设计一个小球加速落地又减速弹起并反复直到停止的Java程序

插值器(Interpolator)的使用说明

Unity3D - 动作动画忽略timeScale

css3动画