SplashScreen例子-代码简单版本
下面是一个**使用官方 Android 12+ SplashScreen API(支持向下兼容)**的完整、详细的例子,覆盖:
• 依赖配置
• 主题设置
• Kotlin 代码逻辑(包括动画、条件控制)
• 启动流程说明
目标
我们实现一个冷启动时显示 logo 动画的 splash screen,并在数据加载完成后进入主界面。
1️⃣ 添加依赖(支持 Android 6.0 到 14)
dependencies {
implementation "androidx.core:core-splashscreen:1.0.1"
}
2️⃣ 设置主题(启动时使用特殊 splash 样式)
<!-- res/values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Splash 配置 -->
<item name="android:windowSplashScreenBackground">@color/white</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item>
<item name="android:windowSplashScreenAnimationDuration">400</item>
<item name="android:postSplashScreenTheme">@style/Theme.MyApp.Normal</item>
</style>
<!-- 主界面主题 -->
<style name="Theme.MyApp.Normal" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- 主界面主题 -->
</style>
注:
• @drawable/ic_splash_logo 通常使用 AnimatedVectorDrawable 或普通静态 logo;
• windowSplashScreenAnimatedIcon 居中显示;
• postSplashScreenTheme 是主界面绘制时应用的真实主题。
3️⃣ AndroidManifest.xml 配置
<application
android:theme="@style/Theme.MyApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
4️⃣ MainActivity.kt 示例代码
@AndroidEntryPoint // 如果你使用 Hilt,不使用可忽略
class MainActivity : AppCompatActivity() {
private val viewModel: SplashViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
// 启用 SplashScreen(必须在 super.onCreate() 前)
val splashScreen = installSplashScreen()
// 设置条件:未加载完前不移除 splash
splashScreen.setKeepOnScreenCondition {
viewModel.isLoading.value
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 其他 UI 初始化
observeData()
}
private fun observeData() {
viewModel.data.observe(this) { result ->
// 进入主界面或展示数据
}
}
}
5️⃣ ViewModel 示例(模拟异步加载)
class SplashViewModel : ViewModel() {
private val _isLoading = MutableLiveData(true)
val isLoading: LiveData<Boolean> = _isLoading
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
init {
// 模拟网络请求
viewModelScope.launch {
delay(2000)
_data.value = "欢迎回来!"
_isLoading.value = false
}
}
}
6️⃣ 显示效果结构图
|-------------------------------|
| windowSplashScreenBG | <-- 背景(纯色/渐变)
| [AnimatedIcon] | <-- 中间 logo(动画/静态)
|-------------------------------|
↓ finishDrawing() 触发后自动移除 ↓
|-------------------------------|
| activity_main.xml |
|-------------------------------|
小结:完整工作流程
阶段 | 行为 |
---|---|
系统启动 App | 显示 windowSplashScreenBackground + 中间 icon |
installSplashScreen() | 拦截主界面绘制时间 |
setKeepOnScreenCondition {} | 控制何时隐藏 Splash |
View 绘制完成 + 条件变 false | 系统自动移除 Splash,进入主 UI |
Bonus:支持动画的 Vector Drawable 示例
<!-- res/drawable/ic_splash_logo.xml -->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_logo">
<target android:name="vector" android:animation="@animator/logo_fade_in" />
</animated-vector>