Преглед изворни кода

fix(miuix): 顶栏预留固定状态栏高度,避免返回书架时内容下移

miuix 顶栏用的是 MiuixTopAppBar 默认的 defaultWindowInsetsPadding=true,
即跟随可见性动画的状态栏 inset;从隐藏状态栏的阅读页返回书架时,状态栏弹回
导致顶栏高度增长、内容被推下去(下移动画)。material 的 TopAppBar 默认用
systemBarsForVisualComponents(忽略可见性)预留固定高度,故无此问题。

改为 defaultWindowInsetsPadding=false + windowInsetsPadding(statusBarsIgnoringVisibility),
与 material 对齐。GlassMediumFlexibleTopAppBar 与 GlassTopAppBar 同步修复。

复现/验证:tools/android/debug.sh run bookshelf/miuix-hidden-statusbar
5151561 пре 3 месеци
родитељ
комит
cae295b088

+ 16 - 2
app/src/main/java/io/legado/app/ui/widget/components/topbar/GlassMediumFlexibleTopAppBar.kt

@@ -6,8 +6,12 @@ import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.statusBarsIgnoringVisibility
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.MaterialTheme
@@ -34,7 +38,11 @@ import top.yukonga.miuix.kmp.basic.MiuixScrollBehavior
 import top.yukonga.miuix.kmp.theme.MiuixTheme
 import top.yukonga.miuix.kmp.theme.MiuixTheme
 import top.yukonga.miuix.kmp.basic.TopAppBar as MiuixTopAppBar
 import top.yukonga.miuix.kmp.basic.TopAppBar as MiuixTopAppBar
 
 
-@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
+@OptIn(
+    ExperimentalMaterial3Api::class,
+    ExperimentalMaterial3ExpressiveApi::class,
+    ExperimentalLayoutApi::class,
+)
 @Composable
 @Composable
 fun GlassMediumFlexibleTopAppBar(
 fun GlassMediumFlexibleTopAppBar(
     title: String,
     title: String,
@@ -90,13 +98,19 @@ fun GlassMediumFlexibleTopAppBar(
     ) {
     ) {
         when {
         when {
             isMiuix -> {
             isMiuix -> {
+                // Reserve constant status-bar space (ignoring visibility) instead
+                // of MiuixTopAppBar's default animating status-bar padding. This
+                // matches Material3's TopAppBar (systemBarsForVisualComponents) so
+                // the bar/content doesn't reflow down when the status bar is
+                // re-shown — e.g. returning from a reader that hid it.
                 MiuixTopAppBar(
                 MiuixTopAppBar(
-                    modifier = Modifier,
+                    modifier = Modifier.windowInsetsPadding(WindowInsets.statusBarsIgnoringVisibility),
                     title = title,
                     title = title,
                     subtitle = subtitleText.orEmpty(),
                     subtitle = subtitleText.orEmpty(),
                     navigationIcon = navigationIcon,
                     navigationIcon = navigationIcon,
                     actions = actions,
                     actions = actions,
                     color = Color.Transparent,
                     color = Color.Transparent,
+                    defaultWindowInsetsPadding = false,
                     scrollBehavior = (scrollBehavior as? MiuixGlassScrollBehavior)?.miuixBehavior
                     scrollBehavior = (scrollBehavior as? MiuixGlassScrollBehavior)?.miuixBehavior
                 )
                 )
             }
             }

+ 11 - 2
app/src/main/java/io/legado/app/ui/widget/components/topbar/GlassTopAppBar.kt

@@ -2,7 +2,11 @@ package io.legado.app.ui.widget.components.topbar
 
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ExperimentalLayoutApi
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.statusBarsIgnoringVisibility
+import androidx.compose.foundation.layout.windowInsetsPadding
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.material3.Text
@@ -18,7 +22,7 @@ import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.theme.responsiveHazeEffect
 import io.legado.app.ui.theme.responsiveHazeEffect
 import top.yukonga.miuix.kmp.basic.TopAppBar as MiuixTopAppBar
 import top.yukonga.miuix.kmp.basic.TopAppBar as MiuixTopAppBar
 
 
-@OptIn(ExperimentalMaterial3Api::class)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
 @Composable
 @Composable
 fun GlassTopAppBar(
 fun GlassTopAppBar(
     title: String,
     title: String,
@@ -46,11 +50,16 @@ fun GlassTopAppBar(
 
 
     Column(modifier = finalModifier) {
     Column(modifier = finalModifier) {
         if (isMiuix) {
         if (isMiuix) {
+            // Reserve constant status-bar space (ignoring visibility) like
+            // Material3's TopAppBar, so content doesn't reflow when the status
+            // bar is re-shown (e.g. returning from a reader that hid it).
             MiuixTopAppBar(
             MiuixTopAppBar(
+                modifier = Modifier.windowInsetsPadding(WindowInsets.statusBarsIgnoringVisibility),
                 title = title,
                 title = title,
                 navigationIcon = navigationIcon,
                 navigationIcon = navigationIcon,
                 actions = actions,
                 actions = actions,
-                color = Color.Transparent
+                color = Color.Transparent,
+                defaultWindowInsetsPadding = false
             )
             )
         } else {
         } else {
             TopAppBar(
             TopAppBar(