Android 12 - Splash Screens

Splash ScreenはAppが初めて実行されるとき、ロードされている画面を隠すために作るの画面です。

Android 12以前は、開発者が直接ページを作ったが、Android 12で動作するAppは、基本的にSplash Screenを表示するように変更されました。

Splash Screens動作様子

以下は、Android Developerで取得したScreen Splashの動作の様子です。

splash screen gmail example

Splash Screens構成

Splash screen composition

  • (1)は、vector drawableです。 Animationを適用することができます。基本的にLauncherのアイコンに設定されています
  • (2)は、Icon background colorであり、設定しなければ(1)の画像のみ表示されます
  • (4)は、backgroundであり、色を指定することができます。基本的に何色も設定されていません

Splash Screensカスタム

/res/values/themes/themes.xmlでThemeのstyleには、次のようにリソースを変更して、カスタムすることができます。

<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="Theme.SplashScreen" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        ...

        <item name="android:windowSplashScreenBackground">#808080</item>
        <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item>
        <item name="android:windowSplashScreenIconBackgroundColor">@color/black</item>
        <item name="android:windowSplashScreenBrandingImage">@drawable/branding</item>
    </style>
</resources>
  • windowSplashScreenBackground:Background colorのプロパティです
  • windowSplashScreenAnimatedIcon:Iconのプロパティです
  • windowSplashScreenIconBackgroundColor:IconのBackground colorのプロパティです
  • windowSplashScreenBrandingImage:Branding Imageのプロパティです。 Branding ImageはSplash screen下部に位置します

上記のように、リソースを変更して実行すると、次のような画面が表示されます。下部に見える Simple Branding画像がBranding Imageです。 Splash screen custom example

長くSplash Screen画面オフセット

初期化がかかる場合には、より長い時間Splash Screen画面が維持されるように実装することができます。

次は、5秒間Splash Screenを浮かべる例です。 isReadyがtrueになるSplash screenが終了します。

class MainActivity : AppCompatActivity() {
    var isReady = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        thread(start=true) {
            for (i in 1..5) {
                Thread.sleep(1000)
            }
            isReady = true
        }

        // 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 (isReady) {
                        // The content is ready; start drawing.
                        content.viewTreeObserver.removeOnPreDrawListener(this)
                        true
                    } else {
                        // The content is not ready; suspend.
                        false
                    }
                }
            }
        )

    }
}

References

codechachaCopyright ©2019 codechacha