From 8204ae15cfbd6b957c242afd6f98d5771168f53d Mon Sep 17 00:00:00 2001 From: xfy Date: Tue, 16 Jun 2026 12:27:12 +0800 Subject: [PATCH] feat(splash): use SplashScreen API with custom background --- app/src/main/AndroidManifest.xml | 8 +- .../kotlin/plus/rua/project/SplashActivity.kt | 45 ----------- app/src/main/res/values-night/themes.xml | 6 +- app/src/main/res/values/themes.xml | 9 +-- .../plus/rua/project/ui/SplashScreen.kt | 77 ------------------- 5 files changed, 5 insertions(+), 140 deletions(-) delete mode 100644 app/src/main/kotlin/plus/rua/project/SplashActivity.kt delete mode 100644 core/src/main/kotlin/plus/rua/project/ui/SplashScreen.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 32abcd2..7df196f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,19 +10,15 @@ android:supportsRtl="true" android:theme="@style/Theme.YaYa"> + android:theme="@style/Theme.YaYa.Starting"> - - diff --git a/app/src/main/kotlin/plus/rua/project/SplashActivity.kt b/app/src/main/kotlin/plus/rua/project/SplashActivity.kt deleted file mode 100644 index 7bd7bed..0000000 --- a/app/src/main/kotlin/plus/rua/project/SplashActivity.kt +++ /dev/null @@ -1,45 +0,0 @@ -package plus.rua.project - -import android.content.Intent -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.compose.ui.res.painterResource -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import plus.rua.project.shared.R as CoreR -import plus.rua.project.ui.SplashScreen -import plus.rua.project.ui.theme.YaYaTheme - -private const val SPLASH_DELAY_MS = 400L - -/** - * 启动页 Activity。 - * - * 显示品牌启动图 400ms 后跳转到 [MainActivity],并 finish 自身。 - */ -class SplashActivity : BaseActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContent { - YaYaTheme { - SplashScreen( - backgroundPainter = painterResource(CoreR.drawable.launch_bg), - iconPainter = painterResource(R.mipmap.ic_launcher), - ) - } - } - - lifecycleScope.launch { - delay(SPLASH_DELAY_MS) - navigateToMain() - } - } - - private fun navigateToMain() { - if (isFinishing) return - startActivityWithSlide(Intent(this, MainActivity::class.java)) - finish() - } -} diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 086cb6a..6138c74 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -3,11 +3,7 @@ - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2297d58..e498332 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -5,15 +5,10 @@ - - diff --git a/core/src/main/kotlin/plus/rua/project/ui/SplashScreen.kt b/core/src/main/kotlin/plus/rua/project/ui/SplashScreen.kt deleted file mode 100644 index e41b919..0000000 --- a/core/src/main/kotlin/plus/rua/project/ui/SplashScreen.kt +++ /dev/null @@ -1,77 +0,0 @@ -package plus.rua.project.ui - -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.statusBars -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.dp - -private const val DarkOverlayAlpha = 0.4f -private val SplashIconSize = 80.dp - -/** - * 品牌启动页 UI。 - * - * 背景图铺满全屏,暗色模式下叠加半透明黑色蒙层降低亮度。 - * app icon 水平居中,其垂直中心位于状态栏下方可用区域高度的约 25% 处。 - * 图片仅用于装饰,因此 contentDescription 为 null。 - * - * @param backgroundPainter 启动背景图的 Painter - * @param iconPainter app icon 的 Painter - * @param modifier 外部传入的 Modifier - */ -@Composable -fun SplashScreen( - backgroundPainter: Painter, - iconPainter: Painter, - modifier: Modifier = Modifier, -) { - val configuration = LocalConfiguration.current - val density = LocalDensity.current - val screenHeightDp = configuration.screenHeightDp.dp - val statusBarHeight = with(density) { WindowInsets.statusBars.getTop(this).toDp() } - val availableHeight = screenHeightDp - statusBarHeight - val iconTopPadding = statusBarHeight + (availableHeight * 0.25f) - (SplashIconSize / 2) - val isDark = isSystemInDarkTheme() - - Box( - modifier = modifier.fillMaxSize(), - ) { - Image( - painter = backgroundPainter, - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.fillMaxSize(), - ) - - if (isDark) { - Box( - modifier = Modifier - .fillMaxSize() - .background(Color.Black.copy(alpha = DarkOverlayAlpha)), - ) - } - - Image( - painter = iconPainter, - contentDescription = null, - modifier = Modifier - .align(Alignment.TopCenter) - .padding(top = iconTopPadding.coerceAtLeast(statusBarHeight)) - .size(SplashIconSize), - ) - } -}