안드로이드 코틀린 Splash 화면 만들기

안드로이드 앱 만들때 진입화면

스플래쉬(Splash) 화면을 만들어서 로고도 보여주고

메인 화면으로 넘어간다

만드는 방법

  • 강제로 3초 딜레이 주는 방법
  • 이미지 이용해서 구현하는 방법

뭘 선택하느냐는 취향차이

강제로 3초 딜레이 주는 방법

스플래쉬 화면 하나 만들고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#11111f"
tools:context=".activity.SplashActivity">

<ImageView
android:id="@+id/imageview_splash_logo"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="150dp"
android:contentDescription="@string/all_logo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/all_logo" />

<ImageView
android:id="@+id/imageview_splash_appname"
android:layout_width="268dp"
android:layout_height="189dp"
android:layout_marginTop="150dp"
android:contentDescription="@string/all_appname"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/imageview_splash_logo"
app:srcCompat="@drawable/all_appname" />
</androidx.constraintlayout.widget.ConstraintLayout>

화면 컨트롤하는 액티비티 만들고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.skyksit.dsam3.activity

import android.annotation.SuppressLint
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.WindowInsets
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import com.skyksit.dsam3.R

@SuppressLint("CustomSplashScreen")
class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.insetsController?.hide(WindowInsets.Type.statusBars())
} else {
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
}
Handler(Looper.getMainLooper()).postDelayed({
val intent = Intent(this, GameListActivity::class.java)
startActivity(intent)
finish()
}, 3000)
}
}

Splash 가 사용하는 테마 만들고

1
2
3
4
5
6
7
<style name="Theme.SplashScreen" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowDisablePreview">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

안드로이드 manifest 파일에서 SplashScreen 이 진입으로 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.splashscreeninandroid">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"></activity>
<activity
android:name=".SplashScreen"
android:theme="@style/Theme.SplashScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

이미지 이용해서 구현하는 방법

테마를 만들고

1
2
3
4
<!-- themes.xml -->
<style name="Theme.Splash" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item>
</style>

drawable 에 splash_background 만들고

여기서 조정한다
background 색상, 로고, 설명 필요없는 건 빼면된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/splash_bg_gradient"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/splash_logo_1"/>
</item>
<item android:bottom="50dp">
<bitmap
android:gravity="center"
android:src="@drawable/splash_logo_2"/>
</item>
</layer-list>

위에 표시한 drawable 을 추가해준다

AndroidManifest 수정

1
2
3
4
5
6
7
8
9
<activity
android:name=".SplashScreenActivity"
android:exported="true"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

SplashScreenActivity 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.skyksit.dsam3

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class SplashScreenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val nextIntent = Intent(this, GameListActivity::class.java)
startActivity(nextIntent)
}
}

장점은 3초 딜레이를 강제로 주지 않기 때문에
콜드 스타트 시간을 당길 수 있다
next 화면이 준비 되면 바로 넘어간다