创建自定义过渡动画

借助自定义过渡效果,您可以制作无法通过任何动画播放的动画 内置的过渡类。例如,您可以定义一个自定义转场, 将文本和输入字段的前景色变为灰色,以表明相应字段已停用 。此类更改有助于用户看到您已停用的字段。

与内置过渡类型之一一样,自定义过渡会将动画应用于 起始场景和结束场景的子视图。不过,与内置转场类型不同 您必须提供捕获属性值并生成动画的代码。 您可能还需要为动画定义目标视图的子集。

本页介绍了如何捕获属性值并生成动画来创建 自定义转场效果。

扩展过渡类

如需创建自定义过渡,请向您的项目添加一个类以扩展 Transition 类,并替换以下代码段中显示的函数:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

下面的部分介绍了如何替换这些函数。

捕获视图属性值

过渡动画使用属性动画系统,如 属性动画概览。属性 动画将视图属性从指定视图的起始值更改为 因此框架需要同时设置 属性以构建动画。

不过,属性动画通常只需要所有视图属性中的一小部分 值。例如,颜色动画需要颜色属性值,而移动 动画需要位置属性值。由于动画所需的属性值 特定于某个过渡,过渡框架并不会提供每个属性值 过渡期。相反,框架会调用允许过渡到 仅捕获所需的属性值并将其存储在框架中。

捕获起始值

要将起始视图值传递给框架,请实现 captureStartValues(transitionValues) 函数。该框架会针对起始场景中的每个视图调用此函数。函数 参数是包含引用的 TransitionValues 对象 以及一个 Map 实例,您可以在该实例中存储自己创建的视图值 。在您的实现中,检索这些属性值并将其传递回 将其存储在 Map 中。

为了确保属性值的键不会与其他 TransitionValues 键,请使用以下命名方案:

package_name:transition_name:property_name

以下代码段展示了 captureStartValues() 函数的一个实现:

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

捕获结束值

框架调用 captureEndValues(TransitionValues) 函数 针对结束场景中的每个目标视图执行一次。在所有其他方面,captureEndValues() 的工作原理与 captureStartValues() 相同。

以下代码段展示了 captureEndValues() 函数的一个实现:

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

在此示例中,captureStartValues()captureEndValues() 函数调用 captureValues() 来检索和存储值。视图属性 captureValues() 检索到的结果是相同的,但前者在 开始和结束场景。框架为起点和终点维护单独的映射 视图的各种状态

创建自定义动画程序

为视图在起始场景中的状态与视图在起始场景中的状态之间的变化添加动画效果 结束场景,通过替换 createAnimator() 函数。当框架调用此函数时,它会传入场景根视图和 包含起始值和结束值的 TransitionValues 对象 。

框架调用 createAnimator() 函数的次数取决于 起始场景与结束场景之间发生的变化。

例如,考虑淡出或 作为自定义过渡实现的淡入动画。如果起始场景有五个目标, 其中两个目标会从结束场景中移除,而结束场景则包含 启动场景加一个新目标,然后框架调用 createAnimator() 六次。 三个调用为同时存在于两个场景中的目标的淡出和淡入添加动画效果 对象的操作。另外两个调用会以动画形式呈现从结束场景中移除的目标的淡出。一个 调用以动画形式呈现结束场景中新目标的淡入。

对于同时存在于起始场景和结束场景中的目标视图,该框架提供 TransitionValues 对象,用于 startValuesendValues 参数。对于仅存在于起始位置或 结束场景中,该框架会提供一个 TransitionValues 对象 对应参数,另一个对应参数 null

如需在创建 createAnimator(ViewGroup, TransitionValues, TransitionValues) 时实现 自定义转场,请使用您捕获的视图属性值创建 Animator 对象并将其返回到框架。如需查看实现示例 请参阅 中的 ChangeColor 类 CustomTransition 示例。如需详细了解属性动画程序,请参阅 属性动画

应用自定义过渡

自定义过渡与内置过渡的工作原理相同。你可以应用自定义转场效果 使用过渡管理程序,如应用过渡中所述。