共享元素转换和内容转换延迟时间

SharedElementTransition and ContentTransition delayed timing

如果我有两个 Activities A 和 B,它们都有一个共享的 ImageView,我希望播放以下转换:

Activity A 到 B 时,我想启动 SharedElementTransition 然后一旦完成,启动 Activity B 的 ContentTransition

Activity B 返回 A 时,我想启动 Activity B 的 ContentTransition 然后一旦完成,启动返回的 SharedElementTransitionActivity A

Transitions这个延迟时间怎么设置? 我猜你需要某种回调监听器,但我不确定要使用哪些。

没有回调。并且没有直接的方法来做到这一点。 对不起。

您可以根据需要以及在这种特定情况下最适合您的方式使用几个不同的组件。

首先,您需要利用 SharedElementCallback

使用共享元素回调,您将能够确定共享元素转换何时完成(以及其他事情)。这将是执行另一个转换的完美位置,如您所说的 'Content Transition'。因此,在检测到 activity B 的共享元素转换完成后,运行 内容转换。

相反,运行在共享元素转换开始之前进行转换会有点棘手。为此,您必须向共享元素转换添加开始延迟。实现此目的的一种方法如下:

getWindow().getSharedElementReenterTransition().setDuration(500);

转换也可以在 XML 中定义。

其次,您应该阅读

onEnterAnimationComplete()

它是 AppCompatActivity 的一部分。您可以在 Activity A 中覆盖此函数。当 activity 的 Enter Transition 完成时调用此回调。这与共享元素转换不同。默认情况下,这是活动发生的淡出/淡入,不包括共享元素转换中涉及的视图。

因此,理论上,您可以:

  1. 设置重新进入共享元素转换的开始延迟
  2. 检测 Activity A 的 Enter 转换完成和 运行 自定义 'content transition'

如果您的计时(开始延迟和动画持续时间)正确,这将起作用。

Shared Element Transitions 一开始的学习曲线非常陡峭,因为有很多活动部件,这不是双关语。我推荐 this read 作为起点。

您还应该阅读内置的 Activity 转换,例如 Explode()Slide()Fade()

它们可以作为 'Content Transitions' 与您的共享元素过渡一起使用,以创建一些非常漂亮的东西。