如何为 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),未指定 constraintSetStart
和 constraintSetEnd
的 Transition
元素被视为 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
找到源代码
不幸的是,没有好的方法来记录不放入某些东西的特性。
我在给定的布局中有三个状态,我希望将相同的插值器用于这些状态之间的任何转换。我如何为所有转换定义(在 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),未指定 constraintSetStart
和 constraintSetEnd
的 Transition
元素被视为 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
找到源代码不幸的是,没有好的方法来记录不放入某些东西的特性。