以编程方式启动运动场景
Start motion scene programmatically
我有一个带有此布局说明的动态布局: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_start
和 view_home_card_end
的 xml 是无关紧要的。
如何以编程方式调用此动画?
我终于这样做了:
((MotionLayout)findViewById(R.id.motionLayout)).transitionToEnd();
((MotionLayout)findViewById(R.id.motionLayout)).transitionToStart();
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>
您也可以在 xml 中使用
motion:autoTransition="animateToEnd"
和
motion:autoTransition="animateToStart"
如果有人从片段中这样做:
导入:
import androidx.constraintlayout.motion.widget.MotionLayout;
实例化 MotionLayout:
MotionLayout motionLayout = view.findViewById(R.id.your_motion_layout);
过渡到 end/start 动议:
motionLayout.transitionToStart();
或
motionLayout.transitionToEnd();
我们可以简单地这样做
motion_layout.transitionToEnd()
但是在 Activity 恢复时,它会启动我们的动画如此之快以至于我们可能会错过少数或整个动画。所以我建议添加一些延迟。
GlobalScope.launch (Dispatchers.IO){
delay(1000)
withContext(Dispatchers.Main){
motion_layout.transitionToEnd()
}
}
如果没有添加Coroutines依赖,还需要添加。
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
我正在使用 transitionToState() 方法在某些动作的状态之间转换。
fun navigateToPayment() {
binding?.motionLayoutContainer?.transitionToState(R.id.statePayment)
}
fun navigateToShipping() {
binding?.motionLayoutContainer?.transitionToState(R.id.stateShipping)
}
在Activity.
中也使用相同的方法处理后退
override fun onBackPressed() {
binding?.motionLayoutContainer?.currentState?.let{
when(it) {
R.id.paymentState -> {
//go back to shipping
binding?.layoutSheet?.transitionToState(R.id.shippingState)
}
R.id.shippingState -> {
//go back to cart
binding?.layoutSheet?.transitionToState(R.id.cartState)
}
else -> {
Toast.makeText(this, "Invalid Transition State", Toast.LENGTH_SHORT).show()
}
}
} ?: run{
//finish activity
super.onBackPressed()
}
}
我有一个带有此布局说明的动态布局: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_start
和 view_home_card_end
的 xml 是无关紧要的。
如何以编程方式调用此动画?
我终于这样做了:
((MotionLayout)findViewById(R.id.motionLayout)).transitionToEnd();
((MotionLayout)findViewById(R.id.motionLayout)).transitionToStart();
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>
您也可以在 xml 中使用
motion:autoTransition="animateToEnd"
和
motion:autoTransition="animateToStart"
如果有人从片段中这样做:
导入:
import androidx.constraintlayout.motion.widget.MotionLayout;
实例化 MotionLayout:
MotionLayout motionLayout = view.findViewById(R.id.your_motion_layout);
过渡到 end/start 动议:
motionLayout.transitionToStart();
或
motionLayout.transitionToEnd();
我们可以简单地这样做 motion_layout.transitionToEnd()
但是在 Activity 恢复时,它会启动我们的动画如此之快以至于我们可能会错过少数或整个动画。所以我建议添加一些延迟。
GlobalScope.launch (Dispatchers.IO){
delay(1000)
withContext(Dispatchers.Main){
motion_layout.transitionToEnd()
}
}
如果没有添加Coroutines依赖,还需要添加。
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
我正在使用 transitionToState() 方法在某些动作的状态之间转换。
fun navigateToPayment() {
binding?.motionLayoutContainer?.transitionToState(R.id.statePayment)
}
fun navigateToShipping() {
binding?.motionLayoutContainer?.transitionToState(R.id.stateShipping)
}
在Activity.
中也使用相同的方法处理后退override fun onBackPressed() {
binding?.motionLayoutContainer?.currentState?.let{
when(it) {
R.id.paymentState -> {
//go back to shipping
binding?.layoutSheet?.transitionToState(R.id.shippingState)
}
R.id.shippingState -> {
//go back to cart
binding?.layoutSheet?.transitionToState(R.id.cartState)
}
else -> {
Toast.makeText(this, "Invalid Transition State", Toast.LENGTH_SHORT).show()
}
}
} ?: run{
//finish activity
super.onBackPressed()
}
}