Compose 沉寝式状态栏与刘海屏

Compose 沉寝式状态栏与刘海屏

全屏主题配置,快捷方法 右击创建全屏Activity,只需要保留Theme,其他删除 new>Activity>Fullscreen Views Activity

ini 复制代码
<style name="Theme.HelloFigmaTwo" parent="android:Theme.Material.Light.NoActionBar" />

//主要是继承无标题主题android:Theme.Material.Light.NoActionBar
<style name="Theme.HelloFigmaTwo.Fullscreen" parent="Theme.HelloFigmaTwo">
    <item name="android:actionBarStyle">@style/Widget.Theme.HelloFigmaTwo.ActionBar.Fullscreen
    </item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowBackground">@null</item>
</style>
ini 复制代码
<activity
    android:name=".StatusBarActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="true"
    android:label="@string/title_activity_status_bar"
    android:theme="@style/Theme.HelloFigmaTwo.Fullscreen"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Theme.kt中主题配置,这是沉寝式核心部分,Android 30前后差异兼容

ini 复制代码
@Composable
fun HelloFigmaTwoTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }

        darkTheme -> DarkColors
        else -> LightColors
    }
    val view = LocalView.current
    if (!view.isInEditMode) {
        SideEffect {
            val activity = (view.context as Activity)
            val window = activity.window
            activity.actionBar?.hide()
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            val compat = WindowCompat.getInsetsController(window, view);
            compat.isAppearanceLightStatusBars = true
            compat.isAppearanceLightNavigationBars = false
            compat.show(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
            compat.hide(WindowInsetsCompat.Type.captionBar())
            compat.systemBarsBehavior =
                WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

            window.statusBarColor = Color.TRANSPARENT//colorScheme.primary.toArgb()
            if (compat.isAppearanceLightStatusBars) {
                //状态栏 全屏 黑色字体
                window.decorView.systemUiVisibility =
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or
                            View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
//                            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
//                            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            } else {
                //状态栏 全屏 白色字体
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
//                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
//                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            }
        }
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}
scss 复制代码
//状态栏
WindowInsetsCompat.Type.statusBars()
//虚拟导航栏
WindowInsetsCompat.Type.navigationBars()
//标题栏
WindowInsetsCompat.Type.captionBar()
//输入键盘
WindowInsetsCompat.Type.ime()
//状态栏+标题栏+虚拟导航栏
WindowInsetsCompat.Type.systemBars()

Compose 中的窗口边衬区

Compose通过Modifier可以直接设置窗口边界区域

带参 WindowInsets

方式一,直接设置边衬区模式

scss 复制代码
.windowInsetsPadding(WindowInsets.safeDrawing)
.windowInsetsPadding(WindowInsets.safeGestures)
.windowInsetsPadding(WindowInsets.safeContent)
.windowInsetsPadding(WindowInsets.displayCutout)

方式二,根据需要灵活设置边衬区

scss 复制代码
Column(Modifier.verticalScroll(rememberScrollState())) {
    Spacer(Modifier.windowInsetsTopHeight(WindowInsets.systemBars))

    Column(
        Modifier.consumeWindowInsets(
            WindowInsets.systemBars.only(WindowInsetsSides.Vertical)
        )
    ) {
        // content
        Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime))
    }

    Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars))
}

方式三,直接全局窗口引用Padding,注意状态边距和刘海边距存在互斥

scss 复制代码
.statusBarsPadding()
.displayCutoutPadding()
.imePadding()
.navigationBarsPadding()

状态栏刘海屏设置官方介绍

相关推荐
传奇开心果编程5 分钟前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程4 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓5 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1235 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium
Dovis(誓平步青云)6 小时前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
五彩小白1 天前
自回归和上下文
android