Skip to content

Commit 4123578

Browse files
committed
[BOOK-308] feat: splash, login, termsAgreementScreen navigation animation 적용
resetRoot와 비슷한 조건이기 때문에 fadeIn-fadeOut 적용하여 애니메이션 통일성 확보
1 parent 878bf7b commit 4123578

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

app/src/main/kotlin/com/ninecraft/booket/di/CircuitModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ abstract class CircuitModule {
2828
): Circuit = Circuit.Builder()
2929
.addPresenterFactories(presenterFactories)
3030
.addUiFactories(uiFactories)
31-
// .setAnimatedNavDecoratorFactory(CrossFadeNavDecoratorFactory())
31+
.setAnimatedNavDecoratorFactory(CrossFadeNavDecoratorFactory())
3232
.build()
3333
}
3434
}

app/src/main/kotlin/com/ninecraft/booket/di/CrossFadeNavDecorator.kt

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import androidx.compose.animation.core.tween
66
import androidx.compose.animation.fadeIn
77
import androidx.compose.animation.fadeOut
88
import androidx.compose.animation.togetherWith
9+
import com.ninecraft.booket.feature.screens.LoginScreen
10+
import com.ninecraft.booket.feature.screens.SplashScreen
11+
import com.ninecraft.booket.feature.screens.TermsAgreementScreen
912
import com.slack.circuit.backstack.NavArgument
1013
import com.slack.circuit.foundation.NavigatorDefaults
1114
import com.slack.circuit.foundation.animation.AnimatedNavDecorator
@@ -24,6 +27,34 @@ class CrossFadeNavDecorator<T : NavArgument>(private val durationMillis: Int) :
2427
override fun AnimatedContentTransitionScope<AnimatedNavState>.transitionSpec(
2528
animatedNavEvent: AnimatedNavEvent,
2629
): ContentTransform {
27-
return fadeIn(tween(durationMillis)) togetherWith fadeOut(tween(durationMillis))
30+
val shouldUseFade = shouldUseFadeAnimation(initialState, targetState)
31+
32+
return if (shouldUseFade) {
33+
fadeIn(tween(durationMillis)) togetherWith fadeOut(tween(durationMillis))
34+
} else {
35+
// Circuit 기본 애니메이션 사용
36+
with(NavigatorDefaults.DefaultDecorator<T>()) {
37+
transitionSpec(animatedNavEvent)
38+
}
39+
}
40+
}
41+
42+
private fun shouldUseFadeAnimation(
43+
initialState: AnimatedNavState,
44+
targetState: AnimatedNavState,
45+
): Boolean {
46+
val fadeScreens = setOf(
47+
SplashScreen::class,
48+
LoginScreen::class,
49+
TermsAgreementScreen::class,
50+
)
51+
52+
val initialScreenClass = initialState.top.screen::class
53+
val targetScreenClass = targetState.top.screen::class
54+
55+
// 앱 시작시 SplashScreen이 첫 화면인 경우 처리
56+
val isAppLaunchToSplash = targetScreenClass == SplashScreen::class
57+
58+
return isAppLaunchToSplash || initialScreenClass in fadeScreens || targetScreenClass in fadeScreens
2859
}
2960
}

feature/splash/src/main/kotlin/com/ninecraft/booket/splash/SplashUi.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.ninecraft.booket.splash
22

3-
import android.R.attr.description
43
import androidx.compose.foundation.Image
54
import androidx.compose.foundation.background
65
import androidx.compose.foundation.layout.Box

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ okhttp = "5.1.0"
4343
retrofit = "3.0.0"
4444

4545
## Circuit
46-
circuit = "0.29.1"
46+
circuit = "0.30.0"
4747

4848
## Logging
4949
logger = "2.2.0"

0 commit comments

Comments
 (0)