Splash screens
日付:2021/04/29
URL:https://developer.android.com/about/versions/12/features/splash-screen
調査者:Go Takahana
カテゴリ:Android 12
一言で表すと
デフォルトの起動アニメーションが使用できる!
概要
Android 12 で SplashScreen API が追加される
標準のデザインが提供されるがカスタムもできる
アプリのプロセスが実行されていないとき(コールドスタート)またはアクティビティが作成されていないとき(ウォームスタート)にユーザーがアプリを起動すると、スプラッシュが表示される。
「コールドスタート」や「ウォームスタート」についてはApp startup timeを参照
アニメーションはXMLで定義
要素
Window background←必須
Animated app icon←必須
Icon background←オプション
アニメーションは2種類
Enter Animation→システムが制御するので、カスタマイズ不可
Exit Animation→SplashScreenViewとアニメーションするアイコンにアクセスができて、任意のアニメーションを実行できる
カスタム方法
背景色
code:styles.xml
<item name="android:windowSplashScreenBackground">@color/...</item>
スプラッシュ画面のアイコン
code:styles.xml
<item name="android:windowSplashScreenAnimatableIcon">@drawable/...</item>
スプラッシュ表示時間
windowSplashScreenAnimationDuration
アイコン背景
windowSplashScreenIconBackground
スプラッシュ画面の下部に表示される画像
(注意)ブランディングイメージを使用しない事
code:styles.xml
<item name=”android:windowSplashScreenBrandingImage”>@drawable/...</item>
スプラッシュ画面を長時間画面に表示したままにする
スプラッシュ画面は、アプリが最初のフレームを描画するとすぐ閉じられる
→ViewTreeObserver.OnPreDrawListenerを使用して、アプリが最初のフレームを描画するのを一時停止することができます。
code:MainActivity.kt
// Create a new event for the activity.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Set the layout for the content view.
setContentView(R.layout.main_activity)
// 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 (viewModel.isReady) {
// The content is ready; start drawing.
content.viewTreeObserver.removeOnPreDrawListener(this)
true
} else {
// The content is not ready; suspend.
false
}
}
}
)
}
Mori Atsushi.icon 無理やり感がすごいw
Exit Animationのカスタマイズ
Activity.getSplashScreen
code:MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// Add a callback that's called when the splash screen is animating to
// the app content.
splashScreen.setOnExitAnimationListener { splashScreenView ->
// Create your custom animation.
val slideUp = ObjectAnimator.ofFloat(
splashScreenView,
View.TRANSLATION_Y,
0f,
-splashScreenView.height.toFloat()
)
...
SplashScreenView.getIconAnimationStart で"アイコン"のアニメーション開始されたのがわかる
→アニメーションの残り時間も計算できる
気になるポイント
特別対応をしなくても全部のアプリでスプラッシュ画面が表示されるのか?
SplashScreenViewの存在
スプラッシュ画面のアイコンは、アプリアイコン以外のdrawableでも良い
android:windowSplashScreenBrandingImage の表示位置がわからない🤔(使ってみよう)
Exit AnimationのカスタマイズはKotlinで
メモ
コメント
Mori Atsushi.icon そもそもスプラッシュスクリーンが必要か問題
mayamito.icon ちょっとカスタマイズしたスプラッシュスクリーンのためにActivityを用意するのは面倒だったのでそれがいらなくなるのは嬉しいかも?
:gumio: よさそうではあるけど、デザイン的なカスタマイズ性は低そう..? みんな似たようなSplashになるのが目指したいのかな。こだわりたい場合は画像で頑張れって感じなのかな
:chigi: windowSplashScreenBrandingImage > "Place an drawable image in the bottom of the starting window." splash windowの下部に画像を出す感じなんだろうけど公式にサポートする理由はなんなんだろう。