Anonymous
Как сделать прозрачную панель состояния Android при наличии верхней панели приложений, простирающейся под ним при прокру
Сообщение
Anonymous » 11 сен 2025, 15:13
Я хочу сделать что -то подобное в приложении Google Photos:
Сначала строка состояния и верхняя панель приложений занимают некоторое пространство:
Код: Выделить всё
class MainActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = Color.Transparent.toArgb()
window.navigationBarColor = Color.Transparent.toArgb()
setContent {
MinimalTheme {
//val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
Scaffold(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection),
containerColor = Color.Magenta,
topBar = {
TopAppBar(
title = { Text("My App") },
modifier = Modifier
.windowInsetsPadding(WindowInsets.statusBars.only(WindowInsetsSides.Horizontal)) // or .Top
.fillMaxWidth(),
//.height(80.dp),
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Red,
titleContentColor = Color.White
),
scrollBehavior = scrollBehavior
//windowInsets = TopAppBarDefaults.windowInsets.only(WindowInsetsSides.top)
)
}
) { scaffoldInnerPadding ->
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(scaffoldInnerPadding)
.background(Color.Gray),
contentPadding = PaddingValues(16.dp)
) {
items(50) { index ->
Text(
"Item $index",
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
color = Color.Black
)
}
}
}
}
}
}
}
@Composable
fun MinimalTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
Log.d("TransparencyTest", "MinimalTheme SideEffect - START")
val window = (view.context as? android.app.Activity)?.window
if (window == null) {
Log.e("TransparencyTest", "Window is NULL in SideEffect")
return@SideEffect
}
window.statusBarColor = android.graphics.Color.TRANSPARENT // Use framework's transparent
Log.d("TransparencyTest", "statusBarColor RE-SET TO TRANSPARENT in SideEffect")
val insetsController = WindowInsetsControllerCompat(window, view)
insetsController.isAppearanceLightStatusBars = !darkTheme
Log.d("TransparencyTest", "isAppearanceLightStatusBars SET TO ${!darkTheme}")
insetsController.isAppearanceLightNavigationBars = !darkTheme
Log.d("TransparencyTest", "MinimalTheme SideEffect - END")
}
}
MaterialTheme(
colorScheme = if (darkTheme) darkColorScheme() else lightColorScheme(),
typography = Typography(),
content = content
)
}
< /code>
Изменить: я думаю, что комментарий Эдрика, по крайней мере, часть решения. Установка LazyColumn
S ContentPadding для каркаса , результаты в списке, не запускающемся с самого верха, но под топапбаром :
Подробнее здесь:
https://stackoverflow.com/questions/797 ... -extending
1757592787
Anonymous
Я хочу сделать что -то подобное в приложении Google Photos: Сначала строка состояния и верхняя панель приложений занимают некоторое пространство: [code]class MainActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) window.statusBarColor = Color.Transparent.toArgb() window.navigationBarColor = Color.Transparent.toArgb() setContent { MinimalTheme { //val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()) Scaffold( modifier = Modifier .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), containerColor = Color.Magenta, topBar = { TopAppBar( title = { Text("My App") }, modifier = Modifier .windowInsetsPadding(WindowInsets.statusBars.only(WindowInsetsSides.Horizontal)) // or .Top .fillMaxWidth(), //.height(80.dp), colors = TopAppBarDefaults.topAppBarColors( containerColor = Color.Red, titleContentColor = Color.White ), scrollBehavior = scrollBehavior //windowInsets = TopAppBarDefaults.windowInsets.only(WindowInsetsSides.top) ) } ) { scaffoldInnerPadding -> LazyColumn( modifier = Modifier .fillMaxSize() .padding(scaffoldInnerPadding) .background(Color.Gray), contentPadding = PaddingValues(16.dp) ) { items(50) { index -> Text( "Item $index", modifier = Modifier .fillMaxWidth() .padding(vertical = 8.dp), color = Color.Black ) } } } } } } } @Composable fun MinimalTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { val view = LocalView.current if (!view.isInEditMode) { SideEffect { Log.d("TransparencyTest", "MinimalTheme SideEffect - START") val window = (view.context as? android.app.Activity)?.window if (window == null) { Log.e("TransparencyTest", "Window is NULL in SideEffect") return@SideEffect } window.statusBarColor = android.graphics.Color.TRANSPARENT // Use framework's transparent Log.d("TransparencyTest", "statusBarColor RE-SET TO TRANSPARENT in SideEffect") val insetsController = WindowInsetsControllerCompat(window, view) insetsController.isAppearanceLightStatusBars = !darkTheme Log.d("TransparencyTest", "isAppearanceLightStatusBars SET TO ${!darkTheme}") insetsController.isAppearanceLightNavigationBars = !darkTheme Log.d("TransparencyTest", "MinimalTheme SideEffect - END") } } MaterialTheme( colorScheme = if (darkTheme) darkColorScheme() else lightColorScheme(), typography = Typography(), content = content ) } < /code> Изменить: я думаю, что комментарий Эдрика, по крайней мере, часть решения. Установка LazyColumn [/code] S ContentPadding для каркаса , результаты в списке, не запускающемся с самого верха, но под топапбаром : Подробнее здесь: [url]https://stackoverflow.com/questions/79753761/how-to-make-android-status-bar-transparent-while-having-a-top-app-bar-extending[/url]