为了让共享元素转换顺利运行,我需要推迟目标活动的繁重初始化。参见以下代码:
getWindow().setSharedElementEnterTransition(enterTransition);
enterTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionEnd(Transition transition) {
init();
}
});
但是,如果此"活动"是从Deep link
或其他没有共享元素的活动启动的。转换永远不会开始,因此onTransitionEnd()
永远不会被调用,init()
永远不会运行。在这种情况下,我应该在"活动"启动后立即调用init()
。
我如何才能知道过渡即将进行?
编辑如果共享元素转换不可用,我还想运行另一个回车转换。所以下面的答案建议使用postponeEnterTransition()
对我的情况不起作用。
您最好在接收活动的onCreate(或其他任何地方)中调用postponedEnterTransition(),在该调用之后实现所有重init(),并在init完成后通过显式调用startPostponedEnterTransfer()来释放转换挂起。如果启动活动不需要共享转换,例如DeepLink等,这将直接进入您的重初始化,不会延迟。
这是代码:
活动A-启动共享元素转换
Intent ActivityDemoOneBIntent = new Intent(ActivityDemo1A.this, ActivityDemo1B.class);
String transitionName = getString(R.string.activityTransitionName);
Bundle optionsBundle = getTransitionOptionsBundle(imageViewAnimated, transitionName);
startActivity(ActivityDemoOneBIntent, optionsBundle);
活动B-"接收"共享元素转换
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo_1_b);
postponeTransition(); // postpone shared element transition until we release it explicitly
// Do all heavy processing here, activity will not enter transition until you explicitly call startPostponedEnterTransition()
// all heavy init() done
startPostponedTransition() // release shared element transition. This can be placed to your listeners as well.
}
private void postponeTransition() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
postponeEnterTransition();
} else {
ActivityCompat.postponeEnterTransition(this);
}
}
private void startPostponedTransition() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
startPostponedEnterTransition();
} else {
ActivityCompat.startPostponedEnterTransition(this);
}
}