【问题标题】:Android - Shared element transitions with calling activity finish()Android - 调用活动完成()的共享元素转换
【发布时间】:2015-06-15 08:19:07
【问题描述】:

我正在努力使应用程序更具材料性,但我只是停留在如何实现一些共享元素转换上。我有一个活动 A 启动另一个 B 然后调用 finish() 以将其从后堆栈中删除。就我而言,我想在两个活动之间共享一个元素,但是一旦它从 A 传递到 B,A 就不再重要了。 如果我在 startActivity(ctx,intent, bundle) 之后不调用 finish(),则退出/进入动画效果很好。但是,如果我调用完成,动画开始前会有一个非常难看的闪烁。

我是否忽略了某些事情,或者我无法做我想做的事情?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    在完成activity A 后,如果你按下返回,B 中的共享元素可能会挂在屏幕上。在ActivityB.onEnterAnimationComplete 中将transitionName 设置为null 以避免这种情况。

    【讨论】:

    • 这对我不起作用,当我这样做时共享元素转换不正确。如果我没有完成活动 A,一切都很好,但我想在过渡完成后这样做。无法让它工作。
    • 只有这个解决方案在使用共享元素过渡时有效
    • 这对我来说几乎是一个很好的解决方案......但它不适用于华为:)
    【解决方案2】:

    更新

    更好更简单的方法

    ActivityCompat. finishAfterTransition(this);
    

    【讨论】:

    • 我似乎找不到finishWithTransition。所以我尝试了finishAfterTransition 也没有工作。
    • 它在支持库中。也尝试增加你的 targetSDK 版本
    • 调用其实是:ActivityCompat.finishAfterTransition(this);刚刚测试过,效果很好。
    • 这仍然会导致我使用共享元素时闪烁。
    • @ksarmalkar, finishAfterTransition 不调用finish 过渡完成后;它只是立即调用finish。因此,如果您正在从 Activity A 过渡到 B,并且 B 淡入,则 A 消失了,因此主屏幕会出现(或可能是另一个 Activity)。注意:这似乎只在使用共享转换时发生。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      supportFinishAfterTransition();
      

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

      PS:拨打supportFinishAfterTransition()时不需要拨打finish()

      【讨论】:

        【解决方案5】:

        如果您使用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
        
                }
            });
        

        【讨论】:

          【解决方案6】:

          我写了一个 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()
                  }
              }
          })
          

          【讨论】:

            猜你喜欢
            • 2014-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-26
            • 1970-01-01
            相关资源
            最近更新 更多