如何为 MotionScene 的所有转换定义通用插值器?

How to define a common interpolator for all transitions of a MotionScene?

我在给定的布局中有三个状态,我希望将相同的插值器用于这些状态之间的任何转换。我如何为所有转换定义(在 XML 或代码中)相同的插值器,而不必像下面那样重复自己?

<?xml version="1.0" encoding="utf-8"?>
<MotionScene 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetStart="@id/state_a"
        motion:constraintSetEnd="@id/state_b"
        motion:motionInterpolator="easeOut"
        motion:duration="250"/>

    <Transition
        motion:constraintSetStart="@id/state_a"
        motion:constraintSetEnd="@id/state_c"
        motion:motionInterpolator="easeOut"
        motion:duration="250"/>

    <Transition
        motion:constraintSetStart="@id/state_b"
        motion:constraintSetEnd="@id/state_c"
        motion:motionInterpolator="easeOut"
        motion:duration="250"/>

    <ConstraintSet android:id="@+id/state_a">...</ConstraintSet>
    <ConstraintSet android:id="@+id/state_b">...</ConstraintSet>
    <ConstraintSet android:id="@+id/state_c">...</ConstraintSet>

</MotionScene>

这是定义所有三个转换通用的插值器或持续时间的方法:

<?xml version="1.0" encoding="utf-8"?>
<MotionScene 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:motionInterpolator="easeOut"
        motion:duration="250" />

    <Transition
        motion:constraintSetStart="@id/state_a"
        motion:constraintSetEnd="@id/state_b" />

    <Transition
        motion:constraintSetStart="@id/state_a"
        motion:constraintSetEnd="@id/state_c" />

    <Transition
        motion:constraintSetStart="@id/state_b"
        motion:constraintSetEnd="@id/state_c" />

    <ConstraintSet android:id="@+id/state_a">...</ConstraintSet>
    <ConstraintSet android:id="@+id/state_b">...</ConstraintSet>
    <ConstraintSet android:id="@+id/state_c">...</ConstraintSet>

</MotionScene>

查看当前的 MotionLayout 源代码 (v2.0.1),未指定 constraintSetStartconstraintSetEndTransition 元素被视为 abstract,它的属性成为 MotionScene 中所有 Transitions 的默认值。

public static class Transition {
    private boolean mIsAbstract = false;
    private int mConstraintSetEnd = -1;
    private int mConstraintSetStart = -1;
    // ...

    // This constructor creates a Transition based on another Transition
    Transition(MotionScene motionScene, MotionScene.Transition global) {
        if (global != null) {
            this.mDefaultInterpolator = global.mDefaultInterpolator;
            this.mDuration = global.mDuration;
            // ...
        }
    }

    private void fill(MotionScene motionScene, Context context, TypedArray a) {
        // Parse attributes from TypedArray, constraintSetStart being one of them
        if (this.mConstraintSetStart == -1) {
            this.mIsAbstract = true;
        }
    }

    // ...
}

当 MotionScene 中的 Transition 是完全抽象的(没有指定开始或结束)时,它变成 mDefaultTransition:

public class MotionScene {
    private MotionScene.Transition mDefaultTransition = null;
    private ArrayList<MotionScene.Transition> mAbstractTransitionList = new ArrayList();
    // ...
}

它像我描述的那样工作,但在当前文档中没有任何参考。 不幸的是,我无法 link 到源代码,因为 AOSP 中没有最新版本(请参阅本期)。查看此代码的唯一方法是通过 IntelliJ 的反编译器。 编辑:来自

的链接

这种可能性在 release notes of beta4. Source available at https://github.com/androidx/constraintlayout 中首次提到。

您可以定义“抽象”过渡。在 beta4 的发行说明中提到 https://developer.android.com/jetpack/androidx/releases/constraintlayout#2.0.0-beta4

注意,它不会成为其他

的基础

您可以在 https://github.com/androidx/constraintlayout

找到源代码

不幸的是,没有好的方法来记录不放入某些东西的特性。