【问题标题】:How to run animation defind in the Android MotionLayout/MotionScene infinitely?如何在 Android MotionLayout/MotionScene 中无限运行动画定义?
【发布时间】:2021-07-05 22:09:12
【问题描述】:

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

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

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

所以,我的问题是:

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

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

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

【问题讨论】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 2020-04-19
        • 2015-02-07
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多