나만 보는 일기장

[Splash Screen] Core SplashScreen API를 이용해 Splash Screen 구현하기 본문

개발/Android

[Splash Screen] Core SplashScreen API를 이용해 Splash Screen 구현하기

Patrick0422 2021. 12. 31. 16:16

스플래시 화면

스플래시 화면이란, 앱 실행 직후 화면이 로딩되는 동안 노출되는 화면으로, 빈칸이 아닌 앱이나 브랜드의 로고 등을 표시함으로써 UX를 높이는 역할을 합니다. 또, 스플래시 화면에서 앱의 버전 확인, 가벼운 네트워크 작업등이 이루어지기도 합니다.

 

스플래시 화면은 Cold Start와 Warm Start시에 표시되고, Hot Start시에는 표시되지 않습니다.

 

Cold Start와 Warm Start, Hot Start에 대한 자세한 내용은 아래 링크를 참조하시길 바랍니다.

 

앱 시작 시간  |  Android 개발자  |  Android Developers

앱 시작 시간 사용자는 앱이 응답하고 빠르게 로드되기를 기대합니다. 시작 시간이 느린 앱은 이 기대를 충족하지 못하며 사용자에게 실망스러울 수 있습니다. 이러한 종류의 좋지 못한 경험으

developer.android.com

 

 

지금까지는 액티비티를 따로 만드는 등의 작업을 통해 스플래시 화면을 직접 만들어야 했지만,

Android 12 버전부터는 SplashScreen API를 통해 공식적으로 지원하기 시작했습니다.

 

SplashScreen API 자체는 SDK 31부터 지원하기 때문에,

2021년 6월 30일에 만들어진 Core SplashScreen API를 통해 SDK 21 이상에서 동일한 기능을 사용할 수 있습니다.

(2021년 12월 31일 기준 Android Studio Project의 minSdk 버전 또한 21)

 

이제 사용법으로 넘어가겠습니다.

 

Dependency 설정

dependencies {

    ...

    // Core SplashScreen
    implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
}

app단위 Gradle에 추가해줍니다.

 

Theme 추가

themes.xml에서 Splash Screen에 쓸, Theme.SplashScreen을 parent로 갖는 스타일을 하나 만들어줍니다.

 

이곳에서 스플래시 화면의 속성들을 지정해 줄 수 있는데, 사용 가능한 속성들은 다음과 같습니다.

windowSplashScreenBackground: 스플래시 화면에 표시될 배경을 설정할 수 있습니다.
windowSplashScreenAnimatedIcon: 스플래시 화면에 표시될 아이콘을 설정할 수 있습니다.
windowSplashScreenAnimationDuration: 스플래시 화면이 표시될 시간을 지정합니다. (최대 1000ms)
postSplashScreenTheme: 스플래시 화면이 종료된 이후 Theme을 설정할 수 있습니다.
<style name="Theme.09P9.SplashScreen" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/blue_09p9</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item>
    <item name="postSplashScreenTheme">@style/Theme.09P9</item>
    <item name="windowSplashScreenAnimationDuration">1000</item>
</style>

위와 같이 설정할 수 있습니다.

 

이외의 추가적인 속성은 다음 링크를 참고하시길 바랍니다.

이후, AndroidManifest.xml에서 application의 theme에 방금 만든 style을 지정해줍니다.

 

Splash Screen 호출

사진에서는 BaseActivity와 Databinding을 썼기 때문에 설명의 구조와는 좀 다를 수 있습니다

이제 액티비티 단에서, setContentView를 호출하기 이전에 installSplashScreen() 함수를 호출해줍니다.

java.lang.IllegalStateException: 
You need to use a Theme.AppCompat theme (or descendant) with this activity.

그러지 않을 경우 위와 같은 예외가 발생하게 됩니다.

 

Splash Screen 지연시키기

위의 설명과 같이 스플래시 화면은 아주 짧은 시간 동안만 보이게 됩니다.

// Create a new event for the activity.
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Set the layout for the content view.
    setContentView(R.layout.main_activity)

    // Set up an OnPreDrawListener to the root view.
    val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                // Check if the initial data is ready.
                return if (viewModel.isReady) {
                    // The content is ready; start drawing.
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    // The content is not ready; suspend.
                    false
                }
            }
        }
    )
}

스플래시 화면을 좀 더 오래 표시하기 위해서 OnPreDrawListener를 통해 스플래시 화면에서 지연시킬 수 있습니다.

 

위 코드에서는 viewModel의 isReady가 true가 될 때까지 스플래시 화면을 표시합니다.

 

이를 응용해 간단한 내부 작업을 스플래시 화면이 표시되는 동안 처리할 수 있습니다.

 

Splash Screen 애니메이션 넣기

splashScreen.setOnExitAnimationListener { splashScreenView ->
    val slideUp = ObjectAnimator.ofFloat(
        splashScreenView,
        View.TRANSLATION_Y,
        0f,
        -splashScreenView.height.toFloat()
    )
    slideUp.interpolator = AnticipateInterpolator()
    slideUp.duration = 200L

    // Call SplashScreenView.remove at the end of your custom animation.
    slideUp.doOnEnd { splashScreenView.remove() }

    // Run your animation.
    slideUp.start()
}

위와 같이 splashScreen에 .setOnExitAnimationListener를 등록해 스플래시 화면이 끝날 때의 애니메이션을 추가할 수 있습니다.

 

 

참고:

 

Core Splashscreen API 구현

Android 12는 사용자 경험을 개선하기위한 새로운 기능인 공식 스플래시 화면 지원을 제공했습니다. 이전에는 앱에서이 시각적 기능을 원하는 경우 사용자 지정 구현을 추가해야 할 수 있으므로이

ichi.pro

 

Comments