【问题标题】:How to run animation defind in the Android MotionLayout/MotionScene infinitely?如何在 Android MotionLayout/MotionScene 中无限运行动画定义?
【发布时间】:2021-07-05 22:09:12
【问题描述】:
【问题讨论】:
标签:
android
android-animation
android-motionlayout
android-motionscene
【解决方案1】:
这可能对用户手机不利,但您可以做到。
一种方法是创建两个转换:
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@+id/start"
motion:autoTransition="animateToEnd"
motion:duration="1000">
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@+id/start"
motion:autoTransition="animateToStart"
motion:duration="1000">
但是如果你想让它循环不要来回
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@+id/start"
motion:autoTransition="animateToEnd"
motion:duration="1000">
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@+id/start"
motion:autoTransition="jumpToStart"
/>
【解决方案2】:
您可以以编程方式启动过渡,并使用过渡侦听器来回重复。不确定这是否是最有效的方法,但我没有找到任何其他方法
private void animateText(){
mMotionLayout.setTransitionListener(new MotionLayout.TransitionListener() {
@Override
public void onTransitionStarted(MotionLayout motionLayout, int i, int i1) {
}
@Override
public void onTransitionChange(MotionLayout motionLayout, int i, int i1, float v) {
}
@Override
public void onTransitionCompleted(MotionLayout motionLayout, int i) {
if (motionLayout.getCurrentState() == R.id.start){
animateText();
} else {
mMotionLayout.transitionToStart();
}
}
@Override
public void onTransitionTrigger(MotionLayout motionLayout, int i, boolean b, float v) {
}
});
mMotionLayout.transitionToEnd();
}
“诀窍”是在转换完成后检查状态并transitionToStart() 或重新运行函数