[Android] 공식문서만 보고 Splash 화면 만들기

uuranus·2023년 4월 9일
0
post-thumbnail

스플래시 화면

스플래시 화면 공식문서는 꼭 영어로 보기를 권한다. 한국어 버전은 이미지가 깨져서 보이지 않는다.
스플래시 화면은 이전에는 직접 만들어 사용했지만 Android12 이상 부터는 SplashScreen API가 생겼다. 따라서, 이전에 만들어둔 스플래시 화면을 SplashScreen API로 migrate해야 한다.

Android 12 이상

공식문서

  • SplashScreen API를 사용하면 된다.
dependencies {
    implementation "androidx.core:core-splashscreen:1.0.0"
}
  • 앱을 실행하거나 액티비티가 아직 생성되지 않았을 때 작동한다.
  • SplashScreen API는 디자인이 정해져 있다.
    스플래시 화면 element
    출처 : 안드로이드 공식문서

커스터마이징 하기

  • SplashScreen의 배경은 Window이기 때문에 Window 관련 theme 값을 변경해야 한다.

  • windowSplashScreenBackground

    • 배경화면 색깔 변경
    • 기본적으로는 다크모드이면 검은색, 라이트모드면 흰색이다.
  • windowSplashScreenAnimatedIcon

    • 가운데 뜨는 앱 아이콘을 애니메이션 있는 버전으로 설정할 수 있다.
    • windowSplashScreenAnimationDuration으로 몇 초동안 보여줄 것인지 설정할 수 있는데, 13부터는 기본적으로 설정한 애니메이션의 시간으로 알아서 설정해줘서 굳이 해줄 필요 없다.
    • AnimationIcon은 어떻게 만드는가?
      • 일련의 Drawable 리스트를 정의한 animation-list XML 파일을 정의하면 된다. 공식문서
  • windowSplashScreenIconBackgroundColor

    • 앱 아이콘이 이미 꽉 찬 버전이면 안 해줘도 되는데 그냥 흰 배경이었다면 배경화면 색상이랑 동일하니까 여기서 아이콘만 더 강조하고 싶을 때 색깔을 설정해주면 된다.
  • windowSplashScreenBrandingImage

    • 앱 아이콘 하단에 브랜드 이미지를 넣을 수 있다. 위 이미지를 예시로 들면 아래에 구글 로고를 넣을 수 있다.
  • windowSplashScreenBehavior

    • 앱 아이콘을 보여줄지 말지 설정 (13이상부터)
  • Activity.getSplashScreen()으로 스플래시 화면에 접근해 setOnExitAnimationListener를 통해서 스플래시 종료 애니메이션을 설정해줄 수 있다.

스플래시 화면 유지하기

  • 스플래시 화면은 액티비티가 준비되면 사라진다.
    하지만, 데이터를 가져와야 하거나 세팅을 해야하는 시간이 있을 수 있다. 이 때, 데이터 세팅까지 완료될때까지 스플래시 화면을 유지할 수 있다.
    • ViewTreeObserver.OnPreDrawListener에서 데이터 세팅 완료를 확인해서 액티비티 생성을 일시정지할 수 있다.
// 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 whether the initial data is ready.
                return if (viewModel.isReady) {
                    // The content is ready. Start drawing.
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    // The content isn't ready. Suspend.
                    false
                }
            }
        }
    )
}

Android 12 이전

공식문서

  • 보통 12 이전에서 스플래시 화면은 스플래시 화면을 위한 액티비티를 만들었거나 windowBackground 속성에 스플래시 이미지를 넣어서 만들었다.
  • windowBackground 속성으로 만들었을 경우
    • 12 이상에서는 SplashScreen 으로 대체되어서 나타날 것이다.
  • 액티비티로 만든 경우
    • SplashScreen 이 나오고 만들어둔 스플래시 화면이 나오게 되어서 스플래시 화면이 중복이 될 것이다.
  • 12이상은 따로 설정하지 않아도 SplashScreen이 생성되지만 12 이전에는 메인 액티비티에서 스플래시 화면을 만들어줘야한다.
class MainActivity : Activity() {

   override fun onCreate(savedInstanceState: Bundle?) {
       // Handle the splash screen transition.
       val splashScreen = installSplashScreen()

       super.onCreate(savedInstanceState)
       setContentView(R.layout.main_activity)

기존의 스플래시 화면용 액티비티 처리

  • 제거하기
    • 데이터가 로드가 되기 전에 splash screen이 계속 보이게 하거나
    • placeholder를 보여주거나
    • 캐싱된 데이터를 보여주는 방식으로 대체
      placeholder
  • 라우팅
    • 내부적으로 라우팅이 이루어지지만 화면에는 보이지 않아야 한다.
class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
  • 브랜딩을 위해 남겨두기
    • splash screen의 종료 애니메이션을 커스텀해서 브랜딩용 액티비티로 넘어가게 하는 방법이 있지만 웬만하면 Splash Screen으로 통합하는 걸 추천

참고사항

  • SplashScreen은 에뮬레이터에서는 앱 아이콘이 안 보인다.
  • 앱을 아예 stack에서 제거하고 다시 실행할 때 어쩌다 한 번씩 앱 아이콘이 뜨긴 하는데 거의 보이지 않는다.
  • 스플래시 화면 디버깅할 때는 실제 기기에서 해보는 걸 추천
profile
Android Developer

0개의 댓글