개발/Android

Splash Screen 구현 (feat.애니메이션)

레란희 2023. 4. 25. 01:52

오늘은 아래의 영상처럼 Splash Screen에 애니메이션을 적용해 볼 것이다. 

6초짜리 만드는데 3시간 걸린 거 실화냐? 가슴이 웅장해진다..

 

1. themes.xml에 아래 코드 추가

    <!-- splash screen -->
    <style name="Theme.FortuneWheel.Starting" parent="Theme.SplashScreen" >
        <item name="android:windowSplashScreenBackground" tools:targetApi="s">@color/white</item>
        <item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="s">@drawable/avd_splash</item>
        <item name="windowSplashScreenAnimationDuration">1500</item>
        <item name="postSplashScreenTheme">@style/Theme.FortuneWheel</item>
    </style>

 

2. drawable 폴더 안에 avd_splash.xml 파일을 만들어준다. 이 파일은 AnimatedVectorDrawable이다.

<?xml version="1.0" encoding="utf-8"?>
<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_launcher_splash">
    <target
        android:name="rotationGroup"
        android:animation="@animator/rotation"
        />

</animated-vector>

 

3. drawable 폴더 안에 ic_launcher_splash.xml 파일을 만들어준다.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="240dp"
    android:height="240dp"
    android:viewportWidth="240"
    android:viewportHeight="240">
    <group
        android:name="rotationGroup"
        android:pivotX="120.0"
        android:pivotY="120.0">
        <path
            android:pathData="M120,120m-80,0a80,80 0,1 1,160 0a80,80 0,1 1,-160 0"
            android:fillColor="#FF648D"/>
        <path
            android:pathData="M120,120m-72.07,0a72.07,72.07 0,1 1,144.15 0a72.07,72.07 0,1 1,-144.15 0"
            android:fillColor="#FFA3BE"/>
        <path
            android:pathData="M188.58,120C188.58,82.12 157.88,51.42 120,51.42C107.96,51.42 96.13,54.59 85.71,60.61L120,120L188.58,120Z"
            android:fillColor="#FFC3D3"/>
        <path
            android:pathData="M85.71,60.61C64.49,72.86 51.42,95.5 51.42,120C51.42,144.5 64.49,167.14 85.71,179.39L120,120L85.71,60.61Z"
            android:fillColor="#FFE7E9"/>
        <path
            android:pathData="M85.71,179.39C96.13,185.41 107.96,188.58 120,188.58C157.88,188.58 188.58,157.88 188.58,120L120,120L85.71,179.39Z"
            android:fillColor="#ffffff"/>
        <path
            android:pathData="M120,120m-11.2,0a11.2,11.2 0,1 1,22.4 0a11.2,11.2 0,1 1,-22.4 0"
            android:fillColor="#FF648D"/>
        <path
            android:pathData="M120,120m-7.33,0a7.33,7.33 0,1 1,14.65 0a7.33,7.33 0,1 1,-14.65 0"
            android:fillColor="#ffffff"/>
    </group>
</vector>

 

 

4. animator 폴더 안에 rotation.xml 파일을 만들어준다.

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:startOffset="300"
    android:duration="1000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360"
    android:valueType="floatType"
    android:interpolator="@android:anim/anticipate_overshoot_interpolator"/>

 

5. AndroidManifest.xml에서 Application theme (또는 첫 Activity의 Theme)를 @style/Theme.FortuneWheel.Starting 로 변경한다.

걱정하지 마라.

Splash Screen이 끝나고 나면 Theme.FortuneWheel.Starting에서 postSplashScreenTheme로 설정한 테마로 변경된다.

 

 

6. 첫번째 액티비티 (일반적으로는 MainActivity)의 onCreate 메소드에 아래 코드를 넣어준다.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
		//(필수)setContentView 이전에 설정해줘야 함
        installSplashScreen()
		
        //(선택)splashScreen이 사라질 때의 애니메이션을 주고 싶다면 아래 코드 입력
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            splashScreen.setOnExitAnimationListener { splashScreenView ->
                val anim = ObjectAnimator.ofFloat(splashScreenView, View.ALPHA, 1f, 0f)
                anim.duration = 1000
                anim.doOnEnd { splashScreenView.remove() }
                anim.start()
            }
        }

        setContentView(binding.root)

 

 


아래는 나의 삽질 일기다.

 

1. Splash screen의 icon에 애니메이션이 안된다?

=> 적용한 Theme의 windowSplashScreenAnimatedIcon에 넣어준 drawable이 AnimatedVectorDrawable이나  AnimationDrawable인지 확인하기 (단, AnimationDrawable 넣어줬을 때도 애니메이션이 되는지는 확인 못함)

=> 적용한 Theme이 Theme.SplashScreen을 상속받았는지 확인하기

 

2. Splash screen의 icon이 잘린다?

=> 전체 크기 240dpx240dp에 아이콘은 160dpx160dp가 되도록 이미지를 만들어야 한다.

=> 만약에 오른쪽같은 이미지 밖에 없어요 라고 하면.. vector 파일(ic_launcher_splash.xml)의 group에 scaleX와 scaleY를 설정해서 크기를 조절해준다.

 

3. Splash screen의 icon의 애니메이션이 안 끝났는데 화면이 이동해요

=> Theme.FortuneWheel.Starting의 windowSplashScreenAnimationDuration를 애니메이션 길이와 같거나 길도록 맞춰주세요.

 

4. Splash screen의 icon의 애니메이션이 너무 빨리 시작해요

=> rotation.xml에 startOffset 속성을 주세요

 

 


 

 

참고 자료 :

https://developer.android.com/develop/ui/views/launch/splash-screen

https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable