Open alfianyusufabdullah opened 3 years ago
Did you solve this? @alfianyusufabdullah Seems like I have a similar issue
I managed to get it to work using this version of the awaitTransitionComplete
extension:
/**
* Wait for the transition to complete so that the given [transitionId] is fully displayed.
*
* @param transitionId The transition set to await the completion of
* @param timeout Timeout for the transition to take place. Defaults to 5 seconds.
*/
@ExperimentalCoroutinesApi
suspend fun MotionLayout.awaitTransitionComplete(transitionId: Int, timeout: Long = 5000L) {
var listener: MotionLayout.TransitionListener? = null
try {
withTimeout(timeout) {
suspendCancellableCoroutine<Unit> { continuation ->
listener = object : SimpleTransitionListener() {
override fun onTransitionCompleted(
motionLayout: MotionLayout,
currentId: Int
) {
apply(::removeTransitionListener)
continuation.resume(Unit, Throwable::printStackTrace)
}
}
continuation.invokeOnCancellation {
listener?.apply(this@awaitTransitionComplete::removeTransitionListener)
}
addTransitionListener(listener)
}
}
} catch (ex: TimeoutCancellationException) {
listener?.apply(this::removeTransitionListener)
}
}
open class SimpleTransitionListener : MotionLayout.TransitionListener {
override fun onTransitionStarted(motionLayout: MotionLayout, startId: Int, endId: Int) {}
override fun onTransitionChange(
motionLayout: MotionLayout,
startId: Int,
endId: Int,
progress: Float
) {
// No-op
}
override fun onTransitionCompleted(motionLayout: MotionLayout, currentId: Int) {
// No-op
}
override fun onTransitionTrigger(
motionLayout: MotionLayout,
triggerId: Int,
endId: Boolean,
progress: Float
) {
// No-op
}
}
viewLifecycleOwner.lifecycleScope.launch {
binding.motionLayout.setTransition(R.id.transition1)
binding.motionLayout.transitionToEnd()
binding.motionLayout.awaitTransitionComplete(R.id.set2)
binding.motionLayout.setTransition(R.id.transition2)
binding.motionLayout.transitionToEnd()
binding.motionLayout.awaitTransitionComplete(R.id.set3)
binding.motionLayout.setTransition(R.id.transition3)
binding.motionLayout.transitionToEnd()
binding.motionLayout.awaitTransitionComplete(R.id.set4)
binding.motionLayout.setTransition(R.id.transition4)
binding.motionLayout.transitionToEnd()
binding.motionLayout.awaitTransitionComplete(R.id.set5)
}
You just have to assign an ID to each Transition:
<Transition
android:id="@+id/transition1"
app:constraintSetEnd="@+id/set2"
app:constraintSetStart="@+id/set1"
app:duration="500">
Hello, this is a question that starts with a curious. How to run some transition sequentially on MotionLayout? I read some references from Medium to use extensions awaitTransitionComplete but didn't work.
This is my motion scene XML
Thank You!