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