Android 12 では SplashScreen の新機能が登場し、すべてのアプリケーションに新しいアプリケーション起動アニメーションが追加され、SplashScreen API を通じて専用のアプリケーション起動アニメーションをカスタマイズできます。
デフォルトでは、新しいアプリの起動アニメーションは背景が白で、アプリのアイコンが中央にあります。
次にSplashScreen APIを使って専用のアプリ起動アニメーションをカスタマイズする方法を紹介します。
これは Android 12 の新機能であるため、関連するすべての API では API 31 を使用する必要があるため、追加の value-v31 を作成し、そこに Themes.xml のコピーを配置する必要があります。
背景色
デフォルトでは、アプリ起動アニメーションの背景は白です。
アプリケーション起動アニメーションの背景色をカスタマイズするには、アプリケーションが使用するテーマに次のコードを設定します。
<item name="android:windowSplashScreenBackground">@color/splash_screen_background</item>
<color name="splash_screen_background">#7B5AB6</color>
注意すべき点は、現時点では android:windowSplashScreenBackground を使用して設定された色は透明度を持たせないことです。6 ビットまたは 8 ビットであり、透明度は FF である必要があります。透明度のある色を使用すると効果がありません。
スタートアイコン
デフォルトでは、アプリアイコンはアプリ起動アニメーションの中心にあります。
アプリケーション起動アニメーションの中央アイコンをカスタマイズするには、アプリケーションが使用するテーマに次のコードを設定します。
<item name="android:windowSplashScreenAnimatedIcon">@drawable/cat</item>
元の画像は次のとおりです。
- 起動アイコンは部分的に切り取られるため、ある程度のパディングを保持する必要があることがわかります。
- 静止画の設定に加えて、アニメーション形式も設定でき、設定では android:windowSplashScreenAnimationDuration を使用してアニメーション時間を設定します。
- 設定したアイコンの背景が透明な場合は、android:windowSplashScreenIconBackgroundColor を追加で設定して、中央のアイコンの背景色をカスタマイズできます。
下の画像 (Google によって非推奨)
android:windowSplashScreenBrandingImage を使用して下部画像を設定します。画像サイズの比率は 2.5:1 である必要があります。
起動時間を遅らせる
android:windowSplashScreenAnimationDuration を使用して起動アニメーションの継続時間を設定しますが、最長は 1000 ミリ秒にのみ設定できます。
多くの場合、起動時にいくつかのアプリケーション構成を取得する必要があり、起動にかかる時間が長くなります。
ViewTreeObserver.OnPreDrawListener を通じてコードに実装できます。
class MainActivity : AppCompatActivity() {
private var isAppReady = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
if (isAppReady) {
content.viewTreeObserver.removeOnPreDrawListener(this)
}
return isAppReady
}
})
delayBootTime()
}
private fun delayBootTime() {
lifecycleScope.launch {
delay(3000)
isAppReady = true
}
}
}
アプリケーション構成の準備が完了すると、onPreDraw は true を返し、リスナーを削除します。ここでは、アプリケーション構成を取得するという時間のかかる操作をシミュレートするために、lay3 秒が使用されています。
onPreDraw は準備が完了した後に true を返さなければならないことに注意してください。そうしないと、常に起動ページでスタックしてしまいます。
終了アニメーションの開始
Android 12 SplashScreen の新機能には、起動時と終了時のアニメーション効果をカスタマイズするための setOnExitAnimationListener メソッドが用意されており、この API はバージョン 12 以降でのみ使用できます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
splashScreen.setOnExitAnimationListener { splashScreenView ->
val slideUp = ObjectAnimator.ofFloat(
splashScreenView,
View.TRANSLATION_Y,
0f,
-splashScreenView.height.toFloat()
)
slideUp.duration = 2000
// 在自定义动画结束时调用splashScreenView.remove()
slideUp.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
splashScreenView.remove()
}
})
slideUp.start()
}
}
下位バージョン互換性あり
Android 12 より前のバージョンでは、SplashScreen の起動アニメーションがなく、空白の背景ページが表示されるため、ユーザー エクスペリエンスが非常に悪くなります。したがって、Google は AndroidX で下位互換性のある SplashScreen ライブラリを提供しています。
構成
implementation 'androidx.core:core-splashscreen:1.0.0'
テーマを設定する
新しいテーマを定義し、アプリケーションに使用します。
<style name="SplashScreenTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splash_screen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/cat</item>
<item name="postSplashScreenTheme">@style/Theme.SplashScreenDemo</item>
</style>
注意すべき点がいくつかあります:
- R.style.Theme_SplashScreen を親にする必要があります
- 起動アイコンのアニメーション モードが失敗する
- windowSplashScreenBackground と windowSplashScreenAnimatedIcon の前には Android はありません。
- postSplashScreenTheme はアプリケーションの元のテーマを指定します。これにより、SplashScreen が終了したときにアプリケーションのテーマを復元できます。
起動アクティビティで設定
setContentView メソッドの前に必ず installSplashScreen メソッドを呼び出してください。setContentView メソッドは Compose の super.onCreate() 内で呼び出されるため、super.onCreate() の前に installSplashScreen を呼び出すことをお勧めします。
installSplashScreen()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
これまでのところ、同じ効果を持つ SplashScreen アニメーションは下位バージョンでも使用できますが、もちろん、起動アニメーションや終了アニメーションなどの一部の Android 12 固有の API はまだ利用できません。