在开始另一个活动之前恢复动画



我有序列动画。动画方向为420mm。动画完成后,我尝试使用ActivityOptionsCompat(从下到上的动画)启动另一个活动。这是我的代码

private void startSceneAnimation() {
    if (imageView != null) {
        ((AnimationDrawable) imageView.getBackground()).start();
        new Handler().postDelayed(() -> {
            Intent intent = new Intent(LoginTestActivity.this,
                    SPLoginActivity.class);
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(LoginTestActivity.this,
                            logo,
                            ViewCompat.getTransitionName(logo));
            startActivity(intent, options.toBundle());
        }, 420);
    }
}

一切都很完美,但我有一个问题。是一种在动画仍然完成时开始新活动(没有停止动画)的任何类型的方法。我尝试在 300 毫米后开始新活动,但我的序列动画完成了

AnimationDrawable在 UI 线程上执行。生成的匿名Handler实例(未为Looper传入任何参数)也在 UI 线程上运行。因此,在AnimationDrawable执行完成后,可能不会在Handler上排队更改活动,因为它们都在同一Thread

尝试改用Timer

Timer timer = new Timer();
timer.schedule(new TimerTask(){
  public void run() {
    Intent intent = new Intent(LoginTestActivity.this,
                SPLoginActivity.class);
        ActivityOptionsCompat options = ActivityOptionsCompat.
                makeSceneTransitionAnimation(LoginTestActivity.this,
                        logo,
                        ViewCompat.getTransitionName(logo));
        startActivity(intent, options.toBundle());
  }
}, 300);

Timer在后台线程中运行,并且由于它快速退出,因此不应导致任何内存泄漏AFAIK。

编辑:似乎启动活动是在Android框架内部完成的(第4614行),如果从UI线程外部尝试,可能会不稳定。您可以尝试在 UI 线程消息队列的前面发布新的 Intent,看看它是否有效,但它可能会导致动画"停止",因为现在使用相同的 UI 线程来处理活动启动。

Timer timer = new Timer();
    timer.schedule(new TimerTask(){
      public void run() {
        new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> {
            Intent intent = new Intent(LoginTestActivity.this,
                    SPLoginActivity.class);
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(LoginTestActivity.this,
                            logo,
                            ViewCompat.getTransitionName(logo));
            startActivity(intent, options.toBundle());
          });
      }
    }, 300);

最新更新