Beeeam

Splash screen api 본문

Android

Splash screen api

Beamjun 2023. 6. 1. 23:00

Splash 화면

앱을 실행하면 맨 처음에 잠깐 나타났다가 없어지는 화면이다.

단순히 로고를 보여주는 경우도 있지만 필요한 리소스를 다운 받는 것을 대기하기 위한 목적으로 사용되기도 한다.

구현 방법

단순하게 Splash 화면을 위한 Activity를 만들고, 시작 Activity로 설정하고 몇 초 뒤에 메인 화면으로 넘어가게 할 수 있다. 하지만 안드로이드 12가 되면서 모든 앱에 강제적으로 Splash 화면에 앱의 아이콘을 보여주게 되었다. 그래서 앞에서 말한 방법을 사용할 수 없다.

Splash screen api를 사용하면 Splash 화면을 간단하게 구현할 수 있다.

 

구현

  1. app단의 build gradle에 라이브러리를 추가한다.
// SplashScreen Api (Android12 뿐만 아니라 그 이하의 버전에서도 동일한 Splash 적용)
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'

2. Theme를 정의한다. (res/values/themes.xml)

<style name="Theme.App.Starting" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/white</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/catsplash</item>
    <item name="windowSplashScreenAnimationDuration">1000</item>
    <item name="postSplashScreenTheme">@style/Theme.CCPAOSCleanArch</item>
</style>

Theme.SplashScreen를 상속 받는 style을 생성한다.

  • windowSplashScreenBackground: Splash 화면의 배경 색 설정
  • windowSplashScreenAnimatedIcon: Splash 화면의 중앙에 표시 될 아이콘 설정
  • windowSplashScreenAnimationDuration: Splash 화면의 지속 시간 설정 (최대 1000ms)
  • postSplashScreenTheme: Splash 화면이 종료된 후 Theme 설정

 

3. AndroidManifest.xml에 Splash 화면 등록

<application
    android:name=".CCPAOSApplication"
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.App.Starting"
    tools:targetApi="31">
    <activity
        android:name="com.example.presentation.ui.MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <meta-data
            android:name="android.app.lib_name"
            android:value="" />
    </activity>
</application>

위처럼 application 태그 안에 android:theme=”@style/설정한 테마” 이렇게 선언한다.

 

4. MainActivity에서 실행

private lateinit var splashScreen: SplashScreen

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    splashScreen =installSplashScreen()
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
		...
		...
}

여기서 중요한 점은 splash 화면 객체를 생성하고 install을 setContentView 전에 해야 하는 것이다.

정확한 이유는 찾아보지 않았지만 Splash 화면 특성 상 앱의 첫 화면이 나타나기 전에 보여야 하기 때문에 Activity의 화면을 보여주는 setContentView 전에 해야 하는 것 같다. (내 뇌피셜)

 

애니메이션 추가

처음에 예시로 보였던 gif를 보면 아이콘이 작아졌다가 커지는 애니메이션을 볼 수 있다. 이는 activity에서 splash 객체를 통해서 만들 수 있다.

private fun startAnimation() {
        splashScreen.setOnExitAnimationListener { splashScreenView ->
            val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.5f, 0.7f)
            val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.5f, 0.7f)

            ObjectAnimator.ofPropertyValuesHolder(splashScreenView.iconView, scaleX, scaleY).run {
                duration = 5000L
                doOnEnd {
                    splashScreenView.remove()
                }
                start()
            }
        }
    }

splashScreen.setOnExitAnimationListener를 통해 스플래시 화면이 종료될 때까지 실행되는 애니메이션을 정의한다. splashScreenView는 스플래시 화면을 구성하는 요소들을 나타내는 객체이다.

 

PropertyValuesHolder를 사용하여 View.SCALE_X와 View.SCALE_Y 속성의 값을 조정하는데 위의 코드는 아이콘의 크기를 0.5배에서 0.7배로 늘리는 애니메이션이다.

 

ObjectAnimator.ofPropertyValuesHolder를 사용하여 애니메이션 객체를 생성하고, run 블록 내에서 애니메이션의 세부 설정 선언한다. duration을 통해서 애니메이션의 시간을 정한다. 위의 경우는 5000ms이다.

 

doOnEnd 블록 내에서는 애니메이션이 종료된 후에 수행할 동작을 정의한다. 여기서는 splashScreenView를 제거하는 동작을 선언 하였다. 이 동작을 선언하지 않으면 splash 화면이 끝나지 않기 때문에 꼭 해줘야 한다.

마지막으로 start()를 호출하여 애니메이션을 시작한다.

 

 

 

Splash screen api 가이드

https://developer.android.com/about/versions/12/features/splash-screen?hl=ko

'Android' 카테고리의 다른 글

Bottom Navigation View  (0) 2023.06.27
Timber Library  (1) 2023.06.04
Custom View  (2) 2023.05.13
앱 내부에서 카메라 실행시키기  (3) 2023.04.19
안드로이드 스튜디오 타이틀 바 제거하기  (0) 2023.04.14