我们怎么知道“活动”共享元素转换将要运行呢



为了让共享元素转换顺利运行,我需要推迟目标活动的繁重初始化。参见以下代码:

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);
    }
}

最新更新