以编程方式开始运动场景

时间:2018-09-21 06:36:43

标签: android android-motionlayout

我的运动布局与此布局描述:app:layoutDescription="@xml/scene"

scene.xml

<MotionScene
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetStart="@layout/view_home_card_start"
        motion:constraintSetEnd="@layout/view_home_card_end"
        motion:duration="1000">
        <OnSwipe
            motion:touchAnchorId="@+id/button"
            motion:touchAnchorSide="left"
            motion:dragDirection="dragLeft" />
    </Transition>

</MotionScene>

我认为view_home_card_startview_home_card_end的xml是不相关的。

如何以编程方式调用此动画?

5 个答案:

答案 0 :(得分:9)

最后我要这样做:

((MotionLayout)findViewById(R.id.motionLayout)).transitionToEnd();
((MotionLayout)findViewById(R.id.motionLayout)).transitionToStart();

答案 1 :(得分:8)

您也可以在xml中使用

motion:autoTransition="animateToEnd"

motion:autoTransition="animateToStart"

答案 2 :(得分:3)

如果有人从片段中这样做:

  1. 导入:

    import androidx.constraintlayout.motion.widget.MotionLayout;
    
  2. 实例化MotionLayout:

    MotionLayout motionLayout = view.findViewById(R.id.your_motion_layout);
    
  3. 过渡到运动的结束/开始:

    motionLayout.transitionToStart();
    

    motionLayout.transitionToEnd();

答案 3 :(得分:0)

In Latest Update of Constraint **2.0.0-beta1** Layout There are Public methods add in motion layout 
        you can get these methods with the help of motionlayout id 
    **motionLayout** 

     1. public void setProgress (float pos) 
     2. public void setTransition (int
           beginId,int endId)  
     3. public void setTransitionDuration (int
               milliseconds)  public void setTransitionListener
               (MotionLayout.TransitionListener listener)

     4. public void setState (int
               id,int screenWidth, 
                             int screenHeight)

     5. if(wantShowUi)
            {
                newUserActivityBinding.coordinatorLayout.transitionToStart();
            }
            else
            {
                newUserActivityBinding.coordinatorLayout.transitionToEnd();
            }

      <android.support.constraint.motion.MotionLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/motionLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layoutDescription="@xml/motion_scene_01"
                tools:showPaths="true">

            <View
                    android:id="@+id/button"
                    android:background="@color/colorAccent"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:soundEffectsEnabled="false"
                    tools:layout_editor_absoluteY="361dp"
                    tools:layout_editor_absoluteX="61dp"/>


        </android.support.constraint.motion.MotionLayout>

答案 4 :(得分:-1)

我们可以这样做 motion_layout.transitionToEnd()

但是在恢复Activity时,它将以如此快的速度启动动画,以至于我们可能会错过一些动画或整个动画。所以我建议增加一些延迟。

GlobalScope.launch (Dispatchers.IO){
        delay(1000)
        withContext(Dispatchers.Main){
            motion_layout.transitionToEnd()
        }
    }

如果没有添加,则还需要添加协程依赖。

实现'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'