Просмотр исходного кода

Merge PR #1795 (preserve fade-out easing)

HapeLee 3 месяцев назад
Родитель
Сommit
2c340d48bb
1 измененных файлов с 34 добавлено и 0 удалено
  1. 34 0
      app/src/main/java/io/legado/app/base/BaseComposeActivity.kt

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

@@ -7,6 +7,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
@@ -14,6 +16,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
@@ -21,6 +25,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,
@@ -46,6 +51,7 @@ abstract class BaseComposeActivity(
         // Compose 入口
         setContent {
             AppTheme {
+                SyncWindowBackground()
                 Content()
             }
         }
@@ -86,11 +92,39 @@ abstract class BaseComposeActivity(
     open fun upBackgroundImage() {
         try {
             ThemeConfigStore.getBgImage(this, windowManager.windowSize)?.let {
+                hasWindowBgImage = true
                 window.setBackgroundDrawable(it.toDrawable(resources))
             }
         } catch (_: Exception) {}
     }
 
+    protected var hasWindowBgImage = false
+    private var lastWindowBgColor: Int? = null
+
+    /**
+     * 窗口背景色与 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) {
+                val colorInt = backgroundColor.toArgb()
+                if (lastWindowBgColor != colorInt) {
+                    window.setBackgroundDrawable(colorInt.toDrawable())
+                    lastWindowBgColor = colorInt
+                }
+            }
+        }
+    }
+
     open fun observeLiveBus() {
         observeEvent<String>(EventBus.RECREATE) {
             recreate()