我们如何知道Activity共享元素过渡将要运行?

6
为了让共享元素过渡更加流畅,我需要推迟目标活动中的重度初始化。请参考以下代码:
getWindow().setSharedElementEnterTransition(enterTransition);
enterTransition.addListener(new Transition.TransitionListener() {
    @Override
    public void onTransitionEnd(Transition transition) {
        init();
    }
});

然而,如果此活动是从Deep link或另一个没有共享元素的活动启动的,则转换永远不会开始,因此onTransitionEnd()不会被调用,init()将永远不会运行。在这种情况下,我应该在活动启动后立即调用init()

我如何知道转换将要运行?


编辑 如果共享元素过渡不可用,我还想运行另一个进入转换。因此,下面的答案建议使用postponeEnterTransition()对我的情况不起作用。

1个回答

2
看起来你最好在接收活动的onCreate(或任何其他地方)调用postponeEnterTransition(),在该调用之后实现所有重要的init(),并通过显式调用startPostponedEnterTransition()释放转换保持。如果不需要共享转换来启动活动(例如DeepLink等情况),则这将直接进入重要的init而没有延迟。
以下是代码:
Activity 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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接