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

时间:2019-01-03 12:43:56

标签: android material-design android-animation

我有序列动画。动画方向为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毫米后开始新活动,但我的序列动画完成了

1 个答案:

答案 0 :(得分:1)

AnimationDrawable在UI线程上执行。 UI线程上也会运行一个匿名Handler实例,该实例没有为Looper传入任何参数。因此,在Handler执行完毕之后,可能不会发生在AnimationDrawable上进行更改以便在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 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);

Timer runs in a background thread,并且由于它可以快速退出,因此不会导致任何内存泄漏AFAIK。

编辑:似乎在Android框架中internally(行4614)已完成启动活动,并且可以wonky if attempted from outside the UI thread开始。您可以尝试将新的Intent发布到UI线程消息队列的前面,看看是否可行,但是无论如何这可能会导致动画“停止”,因为现在该同一个UI线程正在用于处理活动启动。

{{1}}