FEATURE_ACTIVITY_TRANSITIONS 对比 FEATURE_CONTENT_TRANSITIONS

FEATURE_ACTIVITY_TRANSITIONS vs. FEATURE_CONTENT_TRANSITIONS

我在理解这两个 Window 标志之间的区别时遇到了一些麻烦,我不能 100% 确定何时需要使用每个标志以及为什么需要使用它们。

Window.FEATURE_ACTIVITY_TRANSITIONS 的文档说:

Enables Activities to run Activity Transitions either through sending or receiving ActivityOptions bundle created with makeSceneTransitionAnimation(Activity, Pair[]) or makeSceneTransitionAnimation(Activity, View, String).

Window.FEATURE_CONTENT_TRANSITIONS 的文档说:

Flag for requesting that window content changes should be animated using a TransitionManager.

The TransitionManager is set using setTransitionManager(TransitionManager). If none is set, a default TransitionManager will be used.

文档指出以下 Window 方法需要启用 FEATURE_ACTIVITY_TRANSITIONS 标志,但没有说明 FEATURE_CONTENT_TRANSITIONS 是否也需要启用(注意根据 源代码 FEATURE_ACTIVITY_TRANSITIONStrue 并且 FEATURE_CONTENT_TRANSITIONSfalse 对于 material 主题的应用程序默认):

换句话说,根据此信息,FEATURE_ACTIVITY_TRANSITIONS 似乎是应用程序需要启用的功能标志,以便使用 Lollipop 的新 Activity 转换 API。然而,让我感到困惑的是,来自 Android 开发者网站的 this article 声明需要启用 FEATURE_CONTENT_TRANSITIONS 才能实现自定义 activity 转换。

所以这是我的问题:

  1. 这两个标志有什么区别? "activity transition" 和 "content transition" 在这种情况下有什么区别?
  2. 为什么默认启用FEATURE_ACTIVITY_TRANSITIONS而禁用FEATURE_CONTENT_TRANSITIONS?什么时候真正需要启用 FEATURE_CONTENT_TRANSITIONS 标志?
  3. 禁用 FEATURE_ACTIVITY_TRANSITIONS 并启用 FEATURE_CONTENT_TRANSITIONS 是否有意义?或者 FEATURE_CONTENT_TRANSITIONS 是否也需要启用 FEATURE_ACTIVITY_TRANSITIONS

谢谢!

我很高兴有机会回答这些问题,因为文档尚不清楚。

早期,有一个标志 FEATURE_CONTENT_TRANSITIONS 可以处理这两种功能。当 Material 应用程序在启用时出现意外行为时,我们将它们拆分。所以一些较旧的文档可能仍然说你必须启用 FEATURE_CONTENT_TRANSITIONS 才能获得 activity 转换,而它们意味着 FEATURE_ACTIVITY_TRANSITIONS.

  1. What is the difference between these two flags? What is the difference between an "activity transition" and a "content transition" in this context?

在此上下文中的 activity 转换意味着您使用从 ActivityOptions.makeSceneTransitionAnimation 创建的包调用 startActivity 或者,您的 activity 是从该包开始的。 Activity 过渡会修改您的布局(例如淡入淡出元素、移动共享元素),因此如果您的 activity 不喜欢这样,您应该禁用 FEATURE_ACTIVITY_TRANSITIONS.

当您调用 setContentView 时(第一次除外),内容转换使用 TransitionManager。通常情况下,你会得到一个淡入淡出,但如果你的 Activity 的内容有共同点,例如共享 ID 或使用 transitionName,你会得到 ChangeBounds 之间的行为那些意见。您可以使用 XML 或代码自定义与您的 Window 关联的 TransitionManager 来更改转换的详细信息。

  1. Why is FEATURE_ACTIVITY_TRANSITIONS enabled and FEATURE_CONTENT_TRANSITIONS disabled by default? When is enabling the FEATURE_CONTENT_TRANSITIONS flag actually required?

FEATURE_CONTENT_TRANSITIONS 在内容更改时使用 TransitionManager。默认情况下,这是一个交叉淡入淡出,这对某些应用程序来说非常糟糕。另一方面,FEATURE_ACTIVITY_TRANSITIONS 默认情况下不会对大多数应用程序执行任何操作。您必须选择以这种方式启动 activity,因此打开是安全的。

  1. Would it ever make sense to sense to disable FEATURE_ACTIVITY_TRANSITIONS and enable FEATURE_CONTENT_TRANSITIONS? Or does FEATURE_CONTENT_TRANSITIONS require FEATURE_ACTIVITY_TRANSITIONS to be enabled as well?

是的,但不太可能。如果您的应用程序喜欢 FEATURE_CONTENT_TRANSITIONS,它应该与 FEATURE_ACTIVITY_TRANSITIONS 一起工作。如果您想明确限制人们使用共享元素调用您的 activity 或者您不喜欢标准的输入过渡效果,您可以禁用它以防止其他应用程序调用您的应用程序时产生效果。