如何将运行动画定义在AndroidMotionLayout/MotionScene无限?

How to run animation defind in the Android MotionLayout/MotionScene infinitely?

我通过 Google 阅读了这份文档:Manage motion and widget animation with MotionLayout 我还阅读了一些文档,例如 Getting Started with the Motion Editor in Android Studio 4.0

问题是他们都在谈论当我们点击 View/Button 时如何启动动画。我想模拟加载动画,但我想在显示视图时自动启动动画。

我意识到我可以使用下面的代码 运行 动画。但是,问题是,transitionToEnd()运行动画一次。

所以,我的问题是:

  1. 如何运行动画并将其放入循环中? (永远拥有它,直到我停止它。)

  2. 是否可以运行动画从startToEnd,然后endToStart,循环动画?

private fun displayDamLoadingAnimation() {
        val view = layoutInflater.inflate(R.layout.viewgroup_dam_loading, binding.flDamContainer)
        view.motionContainer.transitionToEnd()
    }

这可能对用户不利 phone 但您可以做到。 一种方法是创建两个转换:

<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"
    />

您可以以编程方式启动转换并使用转换侦听器来回重复它。不确定这是否是最有效的方法,但我没有找到任何其他方法

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() 或重新运行 函数