Explorar o código

fix: 同步窗口背景色与 Compose 主题背景色

5151561 hai 3 meses
pai
achega
c6b01694e8

+ 29 - 0
app/src/main/java/io/legado/app/base/BaseComposeActivity.kt

@@ -6,6 +6,8 @@ import androidx.activity.compose.setContent
 import androidx.activity.enableEdgeToEdge
 import androidx.appcompat.app.AppCompatActivity
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.toArgb
 import androidx.core.graphics.drawable.toDrawable
 import androidx.core.view.WindowCompat
 import io.legado.app.constant.EventBus
@@ -13,6 +15,8 @@ import io.legado.app.constant.Theme
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.ThemeConfigStore
 import io.legado.app.ui.theme.AppTheme
+import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.utils.disableAutoFill
 import io.legado.app.utils.fullScreen
 import io.legado.app.utils.observeEvent
@@ -20,6 +24,7 @@ import io.legado.app.utils.setStatusBarColorAuto
 import io.legado.app.utils.themeColor
 import io.legado.app.utils.toggleSystemBar
 import io.legado.app.utils.windowSize
+import top.yukonga.miuix.kmp.theme.MiuixTheme
 
 abstract class BaseComposeActivity(
     val fullScreen: Boolean = true,
@@ -45,6 +50,7 @@ abstract class BaseComposeActivity(
         // Compose 入口
         setContent {
             AppTheme {
+                SyncWindowBackground()
                 Content()
             }
         }
@@ -73,11 +79,34 @@ abstract class BaseComposeActivity(
     open fun upBackgroundImage() {
         try {
             ThemeConfigStore.getBgImage(this, windowManager.windowSize)?.let {
+                hasWindowBgImage = true
                 window.setBackgroundDrawable(it.toDrawable(resources))
             }
         } catch (_: Exception) {}
     }
 
+    private var hasWindowBgImage = false
+
+    /**
+     * 窗口背景色与 Compose 主题背景色同步。
+     * 窗口背景默认来自 XML 主题,与运行时计算的 Compose 主题色存在色差;
+     * 转场淡出、启动交接等场景露出窗口背景时会出现颜色跳变。
+     */
+    @Composable
+    private fun SyncWindowBackground() {
+        if (transparent) return
+        val backgroundColor = if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) {
+            MiuixTheme.colorScheme.surface
+        } else {
+            LegadoTheme.colorScheme.background
+        }
+        SideEffect {
+            if (!hasWindowBgImage) {
+                window.setBackgroundDrawable(backgroundColor.toArgb().toDrawable())
+            }
+        }
+    }
+
     open fun observeLiveBus() {
         observeEvent<String>(EventBus.RECREATE) {
             recreate()

+ 5 - 1
app/src/main/java/io/legado/app/ui/main/MainActivity.kt

@@ -12,6 +12,7 @@ import androidx.activity.compose.BackHandler
 import androidx.compose.animation.AnimatedContentTransitionScope
 import androidx.compose.animation.ExperimentalSharedTransitionApi
 import androidx.compose.animation.SharedTransitionLayout
+import androidx.compose.animation.core.FastOutLinearInEasing
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.LinearOutSlowInEasing
 import androidx.compose.animation.core.tween
@@ -261,6 +262,9 @@ open class MainActivity : BaseComposeActivity(), VariableDialog.Callback {
                 ),
                 sceneStrategies = listOf(SinglePaneSceneStrategy()),
                 transitionSpec = {
+                    // 溶解式转场:两个界面在恒定底色上淡出/淡入(窗口背景色已与
+                    // Compose 主题同步,见 BaseComposeActivity.SyncWindowBackground)。
+                    // 淡出必须用加速曲线,减速曲线会让旧内容开头几帧骤然消失
                     (slideIntoContainer(
                         towards = AnimatedContentTransitionScope.SlideDirection.Start,
                         animationSpec = tween(durationMillis = 480, easing = FastOutSlowInEasing),
@@ -277,7 +281,7 @@ open class MainActivity : BaseComposeActivity(), VariableDialog.Callback {
                     ) + fadeOut(
                         animationSpec = tween(
                             durationMillis = 360,
-                            easing = LinearOutSlowInEasing
+                            easing = FastOutLinearInEasing
                         )
                     ))
                 },