Android 12 SplashScreen启动屏
SplashScreen是 Android 12 引入的特性,为了统一启动屏和优化启动,增加了 纯色背景+自适应图标 的启动屏。
一、启动图设计
启动页,由以下组成:
- 图标(矢量图)
- 图标背景(颜色)
- 图标遮罩层
- 窗口背景(颜色)
上图中 1-2 屏是 无图标背景的显示效果;3-4 屏是 有图标背景色的显示效果。
样式尺寸
类型 | 大小 | 说明 |
---|---|---|
应用图标 | 240x240dp | 内容在160dp圆内 |
应用图标(无图标背景) | 288x288dp | 内容在192dp圆内 |
品牌图片 | 200x80dp | - |
图标内容为 2/3 大小,图标遮罩(盖)层为 1/3 大小。
二、使用
1. 这里直接使用 兼容库
dependencies {implementation "androidx.core:core-splashscreen:1.0.0"
}
2. 主题配置启动屏
添加启动屏主题,设置到 <activity />
的 android:theme
属性上。
主题继承 Theme.SplashScreen
或 Theme.SplashScreen.IconBackground
,区别是:
Theme.SplashScreen
没有图标背景,图标大小288dp,Theme.SplashScreen.IconBackground
设置图标背景色,图标240dp
<style name="Theme.App.Splash" parent="Theme.SplashScreen"><item name="windowSplashScreenBackground">#FF0000</item><item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher_round</item><item name="windowSplashScreenAnimationDuration">280</item><item name="postSplashScreenTheme">@style/Theme.App</item>
</style>
主题属性:
windowSplashScreenBackground
设置背景色或图片windowSplashScreenAnimatedIcon
设置中间的 图标windowSplashScreenAnimationDuration
中间 动画矢量图标 的时间postSplashScreenTheme
设置启动完成后的 主题,即 Activity 实际主题
3. 添加启动屏到Activity
调用 installSplashScreen()
设置 启动屏,然后 监听启动屏结束
splashScreen.setOnExitAnimationListener
。
注意:
- 默认自动 移除 启动屏;
- 设置
setOnExitAnimationListener
时,需要手动splashScreenViewProvider.remove()
移除 启动屏。
class SplashActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {val splashScreen = installSplashScreen()super.onCreate(savedInstanceState)setContentView(R.layout.activity_splash)splashScreen.setOnExitAnimationListener(object : SplashScreen.OnExitAnimationListener {override fun onSplashScreenExit(splashScreenViewProvider: SplashScreenViewProvider) {splashScreenViewProvider.remove()// 启动屏结束后,跳转页面navToMain()finish()}})}private fun navToMain() {val intent = Intent(this, MainActivity::class.java)startActivity(intent)}
}
4. 保持启动屏显示
通常 启动页 显示完后,可能APP并没有完全初始化。此时 可能需要等待,为了 保持 启动页 显示,可通过 OnPrewDrawListener
配置 false 保持 第一帧,不再绘制。
或直接使用 splashScreen.setKeepOnScreenCondition()
,更简单地 保持和取消 启动屏显示。
val isAppInited = falsesplashScreen.setKeepOnScreenCondition {!isAppInited
}
说明:
上述方法,内部也是使用 ViewTreeObserver
的 addOnPreDrawListener
和 removeOnPreDrawListener
方法,
来 保持第一帧的显示 和 继续绘制。
直到 Condition
返回 false
时,才会触发 setOnExitAnimationListener
的回调。
文档
- 启动画面 | Android
- 使用自适应图标 | Android
- NowInAndroid 参考项目的启动屏设计
- SplashScreen | Android Reference
- 用一个开屏动画来看动效/开发工作流