【问题标题】:Android: How to run some code on animation endAndroid:如何在动画结束时运行一些代码
【发布时间】:2018-03-27 21:08:19
【问题描述】:

在 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,这是我将解决方案移植到我的代码中的地方,但它似乎不适用于我的情况。绿色到白色的淡入淡出工作,但完成后它只是重新启动动画而不在文本视图中设置新文本。

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

【问题讨论】:

  • 你试过设置colorAnimation.setRepeatCount(0);并删除 colorAnimation.setRepeatMode(ValueAnimator.RESTART);这一行?
  • 试试这个 colorAnimation.setRepeatCount(0);

标签: android android-animation


【解决方案1】:

试试这个

使用这个

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();

你也可以使用AnimatorListenerAdapter

此适配器类提供来自Animator.AnimatorListener 的方法的空实现。任何只关心此侦听器方法子集的自定义侦听器都可以简单地继承此适配器类,而不是直接实现接口。

试试这个

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();


    }


}

【讨论】:

    【解决方案2】:

    尝试在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) {
    
                }
            });
    

    【讨论】:

      【解决方案3】:

      问题出在这行代码

      colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
      

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

      【讨论】:

        【解决方案4】:

        设置 RepeatCount = 0

        colorAnimation.setRepeatCount(0);
        

        代替

        colorAnimation.setRepeatCount(ValueAnimator.INFINITE);
        

        【讨论】:

          猜你喜欢
          • 2021-01-18
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-11
          相关资源
          最近更新 更多