이전글에서 안드로이드의 MotionLayout에 대하여 말한적이 있습니다.
이당시 Transition이 하나만 있었기 때문에 progress 속성으로 MotionLayout의 상태를 조작할수 있었습니다.
그렇다면
그렇다면 복수의 Transition이 있다면 앱에서는 어떤 반응을 할까요? 그럴때는 가장위에있는 Transition이 현재 Transition이됩니다. 해당 Transition의 경우 코드에서도 바꿀수 있고 xml에서 autoTransition을 이용하여 해당 상태가되면 자동으로 Transition이 실행됩니다.
autoTransition의 속성
none
autoTransition이 없음을 나타냅니다. 즉, 자동으로 Transition이 시작되지 않습니다. 이 옵션을 선택하면 사용자가 명시적으로 Transition을 시작해야 합니다.
jumpToStart
Transition이 시작될 때 즉시 시작 상태로 전환됩니다. 애니메이션 없이 시작 상태로 즉시 이동합니다.
jumpToEnd
Transition이 시작될 때 즉시 종료 상태로 전환됩니다. 애니메이션 없이 종료 상태로 즉시 이동합니다.
animateToStart
Transition이 시작될 때 시작 상태로 애니메이션되어 이동합니다. 시작 상태로 자연스럽게 애니메이션됩니다.
animateToEnd
Transition이 시작될 때 종료 상태로 애니메이션되어 이동합니다. 종료 상태로 자연스럽게 애니메이션됩니다.
<Transition
android:id="@+id/delayStartTransition"
app:autoTransition="animateToEnd"
app:constraintSetStart="@+id/delayStart"
app:constraintSetEnd="@+id/start"
app:duration="5000" />
<Transition
android:id="@+id/delayStartToFanOut"
app:autoTransition="jumpToEnd"
app:constraintSetStart="@+id/start"
app:constraintSetEnd="@+id/fanOut"
app:duration="5000"/>
이런식으로 자동으로 delayStart에서 fanOut까지의 애니메이션을 보여줄수도 있습니다.
with(motionLayout) {
setTransition(currentState, endStateId)
transitionToEnd()
}
코드에서는 위와같은 방법으로 Transition을 연결하게되면 해당 currentState를 start로 가지고 endStateId를 end로 설정된 Transition을 불러와서 사용자에게 보여주게 됩니다.


onTransitionStarted
Transition이 시작될 때 호출됩니다. 애니메이션이 시작되는 시점에서 호출되며, 애니메이션이 시작되는 동안 한 번만 호출됩니다.
onTransitionChange
Transition 중에 애니메이션의 진행 상황이 변경될 때 호출됩니다. 애니메이션 진행률이 변경될 때마다 호출되며, 현재 진행 상황에 대한 정보를 제공합니다.
onTransitionCompleted
Transition이 완료될 때 호출됩니다. 애니메이션이 완전히 종료되고 뷰가 새로운 상태에 도달했을 때 호출됩니다.
onTransitionTrigger
Transition이 트리거될 때 호출됩니다. 예를 들어, 이벤트나 조건에 의해 Transition이 트리거될 때 호출됩니다.
이런식으로 모션레이아웃에 TransitionListener를 지정할수있습니다.
reference
https://developer.android.com/reference/androidx/constraintlayout/motion/widget/MotionLayout
https://developer.android.com/reference/androidx/constraintlayout/motion/widget/MotionLayout.TransitionListener