以编程方式启动运动场景

Pab*_*rra 7 android android-motionlayout

我有一个这个layoutDescription的动画布局: 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>
Run Code Online (Sandbox Code Playgroud)

我认为xml view_home_card_startview_home_card_end无关紧要.

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

Pab*_*rra 14

最后我这样做:

((MotionLayout)findViewById(R.id.motionLayout)).transitionToEnd();
((MotionLayout)findViewById(R.id.motionLayout)).transitionToStart();
Run Code Online (Sandbox Code Playgroud)

  • 如果motionLayout有很多转场怎么办? (2认同)

小智 14

你也可以在你的 xml 中使用

motion:autoTransition="animateToEnd"
Run Code Online (Sandbox Code Playgroud)

motion:autoTransition="animateToStart"
Run Code Online (Sandbox Code Playgroud)


Ank*_*bey 7

我们可以简单地像这样 motion_layout.transitionToEnd()

但是在 Activity 恢复时,它会非常快地启动我们的动画,以至于我们可能会错过少数或整个动画。所以我建议添加一些延迟。

GlobalScope.launch (Dispatchers.IO){
        delay(1000)
        withContext(Dispatchers.Main){
            motion_layout.transitionToEnd()
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果未添加,您还需要添加 Coroutines 依赖项。

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


小智 6

如果有人从片段中执行此操作:

  1. 进口:

    import androidx.constraintlayout.motion.widget.MotionLayout;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实例化 MotionLayout:

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

    motionLayout.transitionToStart();
    
    Run Code Online (Sandbox Code Playgroud)

或者

    motionLayout.transitionToEnd();
Run Code Online (Sandbox Code Playgroud)