Android - 通过调用 activity finish() 共享元素转换
Android - Shared element transitions with calling activity finish()
我正在努力使应用程序更加 Material,但我只是在研究如何实现一些共享元素转换。我有一个 activity A 启动另一个 B 然后调用 finish() 以便将其从返回堆栈中删除。在我的例子中,我有一个要在两个活动之间共享的元素,但是一旦它从 A 传递到 B,A 就不再重要了。
如果我在 startActivity(ctx,intent, bundle) 之后不调用 finish(),exit/enter 动画效果很好。但是,如果我调用 finish,动画开始前会出现非常难看的闪烁。
我是否忽略了什么,或者我无法做我想做的事情?
您可以在 onStop 函数中完成您的 activity,如果您只希望在从 A 转换到 B 时发生这种情况,那么创建一个标志并在调用 startActivity(ctx,intent, bundle) 后设置它):
@Override
public void onStop() {
super.onStop();
if(mShouldFinish)
finish();
}
确保当你完成 activity B 时调用 finish() 而不是 finishAfterTranstion() 因为 activity A 不再存在
完成 activity A 后,如果您按返回键,B 中的共享元素可能会挂在屏幕上。在 ActivityB.onEnterAnimationComplete
中将 transitionName 设置为 null 以避免这种情况。
更新
更好更简单的方法
ActivityCompat. finishAfterTransition(this);
<3 支持库。
在 5.0 及更高版本中试用 finishAfterTransition() 方法,您可以在退出转换发生后完成 activity。
这可能有点晚了,但我遇到了同样的问题。
对我有用的是:
supportFinishAfterTransition();
这包含在支持库中,效果很好。
PS:调用supportFinishAfterTransition()
时不需要调用finish()
。
如果您使用 ActivityOptions.makeSceneTransitionAnimation(Activity, android.view.View, String)
进行转换,您应该使用其在 Activity B 中的回调方法来完成 Activity 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
}
});
我写了一个 的变体,我觉得它更优雅一些,因为你不需要字段。
这仍然远非理想,但它适用于我的用例,它基本上是一个过渡到下一个屏幕的闪屏,我希望立即关闭闪屏。
这是有效的,因为当 activity 不再可见时调用 onStop
,因此此时我们实际上可以关闭它而不会导致伪影(在这种情况下闪烁/闪烁)
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_STOP) {
lifecycle.removeObserver(this)
finish()
}
}
})
我正在努力使应用程序更加 Material,但我只是在研究如何实现一些共享元素转换。我有一个 activity A 启动另一个 B 然后调用 finish() 以便将其从返回堆栈中删除。在我的例子中,我有一个要在两个活动之间共享的元素,但是一旦它从 A 传递到 B,A 就不再重要了。 如果我在 startActivity(ctx,intent, bundle) 之后不调用 finish(),exit/enter 动画效果很好。但是,如果我调用 finish,动画开始前会出现非常难看的闪烁。
我是否忽略了什么,或者我无法做我想做的事情?
您可以在 onStop 函数中完成您的 activity,如果您只希望在从 A 转换到 B 时发生这种情况,那么创建一个标志并在调用 startActivity(ctx,intent, bundle) 后设置它):
@Override
public void onStop() {
super.onStop();
if(mShouldFinish)
finish();
}
确保当你完成 activity B 时调用 finish() 而不是 finishAfterTranstion() 因为 activity A 不再存在
完成 activity A 后,如果您按返回键,B 中的共享元素可能会挂在屏幕上。在 ActivityB.onEnterAnimationComplete
中将 transitionName 设置为 null 以避免这种情况。
更新
更好更简单的方法
ActivityCompat. finishAfterTransition(this);
<3 支持库。
在 5.0 及更高版本中试用 finishAfterTransition() 方法,您可以在退出转换发生后完成 activity。
这可能有点晚了,但我遇到了同样的问题。 对我有用的是:
supportFinishAfterTransition();
这包含在支持库中,效果很好。
PS:调用supportFinishAfterTransition()
时不需要调用finish()
。
如果您使用 ActivityOptions.makeSceneTransitionAnimation(Activity, android.view.View, String)
进行转换,您应该使用其在 Activity B 中的回调方法来完成 Activity 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
}
});
我写了一个
这仍然远非理想,但它适用于我的用例,它基本上是一个过渡到下一个屏幕的闪屏,我希望立即关闭闪屏。
这是有效的,因为当 activity 不再可见时调用 onStop
,因此此时我们实际上可以关闭它而不会导致伪影(在这种情况下闪烁/闪烁)
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_STOP) {
lifecycle.removeObserver(this)
finish()
}
}
})