我有序列动画。动画方向为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);