Android - 调用活动完成的共享元素转换()

时间:2015-04-09 19:37:32

标签: java android android-5.0-lollipop activity-finish shared-element-transition

我正在努力使应用程序更具实质性,而我只是坚持如何实现一些共享元素转换。我有一个活动A,它启动另一个B,然后调用finish()以便从后栈中删除它。在我的情况下,我有一个我想在两个活动之间分享的元素,但是一旦它从A传递到B,A就不再重要了。 如果我在startActivity(ctx,intent,bundle)之后没有调用finish(),则退出/输入动画效果很好。但是,如果我打电话给完成,那么在动画开始之前会有一个非常丑陋的闪烁。

我有什么东西可以忽略,或者是不可能做我想做的事情?

6 个答案:

答案 0 :(得分:27)

更新

更好更简单的方式

ActivityCompat. finishAfterTransition(this);

< 3支持库。

答案 1 :(得分:24)

你可以在onStop函数中完成你的活动,如果你只想在从A转换到B时发生这种情况,那么在你调用startActivity(ctx,intent,bundle)之后创建一个标志并设置它:

@Override
public void onStop() {
    super.onStop();
    if(mShouldFinish)
         finish();
}

确保完成活动B后调用finish()而不是finishAfterTranstion(),因为活动A不再存在

完成活动A后,如果按回,B中的共享元素可能会挂起。在ActivityB.onEnterAnimationComplete中将transitionName设置为null以避免这种情况。

答案 2 :(得分:5)

这可能晚了,但我遇到了同样的问题。 对我有用的是:

supportFinishAfterTransition();

这包含在支持库中,就像魅力一样。

PS:致电finish()时,您无需致电supportFinishAfterTransition()

答案 3 :(得分:2)

在5.0及以上版本中尝试 finishAfterTransition()方法,您可以在退出转换发生后完成活动。

答案 4 :(得分:0)

如果您使用ActivityOptions.makeSceneTransitionAnimation(Activity, android.view.View, String)进行转换,则应在活动B中使用其回调方法来完成活动A。

    setEnterSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
            super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
                // finish Activity A

        }
    });

答案 5 :(得分:0)

我写了this answer的一种变体,因为您不需要字段,所以我觉得它更优雅。
这仍然不是理想的选择,但是它在我的用例中是可行的,它基本上是一个初始屏幕,可以转换到下一个屏幕,我希望立即关闭初始屏幕。 之所以有效,是因为当活动不再可见时调用了onStop,因此在这一点上,我们实际上可以关闭它而不会造成伪像(在这种情况下,该闪烁/闪烁)

lifecycle.addObserver(object : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        if (event == Lifecycle.Event.ON_STOP) {
            lifecycle.removeObserver(this)
            finish()
        }
    }
})