Android: 如何 运行 动画结束时的一些代码

Android: How to run some code on animation end

在 android 我正在尝试创建一个倒计时动画,它会做两件事:

  1. 它将一个正方形从绿色渐变为白色
  2. 执行后它会更改文本视图的上下文

密码是:

    int colorFrom = getResources().getColor(R.color.green);
    int colorTo = getResources().getColor(R.color.white);
    ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
    colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
    colorAnimation.setRepeatMode(ValueAnimator.RESTART);
    colorAnimation.setDuration(30000); // milliseconds
    colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animator)
        {
            tv.setBackgroundColor((int) animator.getAnimatedValue());
        }

    });

    colorAnimation.addListener(new AnimatorListenerAdapter()
    {
        @Override
        public void onAnimationEnd(Animator animation)
        {
            String authcode = getAuthCode(login_session);
            code.setText(authcode);            
        }
    });

    colorAnimation.start();

我知道 Detecting when ValueAnimator is done,这是我将解决方案移植到我的代码中的地方,但它似乎不适用于我的情况。绿色到白色的渐变有效,但完成后它只是重新启动动画,而没有在文本视图中设置新文本。

我做错了什么,动画结束时如何设置新文本?

尝试在下面添加 callback 以获得 addListener

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

            }

            @Override
            public void onAnimationEnd(Animator animator) {
              String authcode = getAuthCode(login_session);
              code.setText(authcode);
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });

Try this

使用这个

colorAnimation.setRepeatCount(0);

而不是这个

colorAnimation.setRepeatCount(ValueAnimator.INFINITE);

示例代码

int colorFrom = getResources().getColor(R.color.green);
        int colorTo = getResources().getColor(R.color.lightWhite);
        ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        colorAnimation.setRepeatCount(0);
        colorAnimation.setRepeatMode(ValueAnimator.RESTART);
        colorAnimation.setDuration(3000); // milliseconds
        colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animator) {
                tv.setBackgroundColor((int) animator.getAnimatedValue());
            }

        });

        colorAnimation.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationEnd(Animator animation)
            {
                tv.setText("TEST");
            }
        });
        colorAnimation.start();

OR

您也可以使用AnimatorListenerAdapter

This adapter class provides empty implementations of the methods from Animator.AnimatorListener. Any custom listener that cares only about a subset of the methods of this listener can simply subclass this adapter class instead of implementing the interface directly.

试试这个

public class MainActivity extends AppCompatActivity {

    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv = findViewById(R.id.tv);

        int colorFrom = getResources().getColor(R.color.green);
        int colorTo = getResources().getColor(R.color.lightWhite);
        ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
        //colorAnimation.setRepeatMode(ValueAnimator.RESTART);
        colorAnimation.setDuration(3000); // milliseconds
        colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animator) {
                tv.setBackgroundColor((int) animator.getAnimatedValue());
            }

        });

        colorAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationCancel(Animator animation) {
                super.onAnimationCancel(animation);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                tv.setText("END");
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                super.onAnimationRepeat(animation);
                tv.setText("REPEAT");
            }

            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
                tv.setText("START");
            }

            @Override
            public void onAnimationPause(Animator animation) {
                super.onAnimationPause(animation);
                tv.setText("PAUSE");
            }

            @Override
            public void onAnimationResume(Animator animation) {
                super.onAnimationResume(animation);
                tv.setText("RESUME");
            }
        });

        colorAnimation.start();


    }


}

问题出在这行代码

colorAnimation.setRepeatCount(ValueAnimator.INFINITE);

它会继续动画因此动画结束的回调永远不会完成。 如果您只是评论该行,您将在 30 秒后(如您在代码中所建议的那样)完成动画结束的回调。

设置RepeatCount = 0

colorAnimation.setRepeatCount(0);

而不是

colorAnimation.setRepeatCount(ValueAnimator.INFINITE);