如何更改jetpack compose中的状态栏颜色?

时间:2021-01-07 10:01:46

标签: android-jetpack-compose

如何使状态栏颜色透明,如下所示:

enter image description here

它有相同的颜色,但有一点阴影。

6 个答案:

答案 0 :(得分:6)

我使用了在 Jetpack Compose 示例中找到的此代码。这对我来说可以。只需根据自己的喜好进行调整。

@Composable
fun SystemUi(windows: Window) =
    MaterialTheme {
        windows.statusBarColor = MaterialTheme.colors.surface.toArgb()
        windows.navigationBarColor = MaterialTheme.colors.surface.toArgb()

        @Suppress("DEPRECATION")
        if (MaterialTheme.colors.surface.luminance() > 0.5f) {
            windows.decorView.systemUiVisibility = windows.decorView.systemUiVisibility or
                    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        }

        @Suppress("DEPRECATION")
        if (MaterialTheme.colors.surface.luminance() > 0.5f) {
            windows.decorView.systemUiVisibility = windows.decorView.systemUiVisibility or
                    View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
        }
    }

答案 1 :(得分:6)

Google 刚刚创建了一个名为 accompanist 的库。
您可以在这里找到它:https://github.com/google/accompanist

它包含多个有用的 Jetpack Compose 库,其中包括一个系统 UI 控制器,您可以使用它来更改状态栏颜色。

文档 - https://google.github.io/accompanist/systemuicontroller/

答案 2 :(得分:3)

只需采用老式的方式并将其添加到 themes.xml 中:

<item name="android:windowTranslucentStatus">true</item>

答案 3 :(得分:2)

简单的答案是: 前往您的 MainActivity.kt,然后输入这些代码

WindowCompat.setDecorFitsSystemWindows(window, false)

这在之前

    setContent{}

然后前往您的 values 文件夹,打开 colors.xml 并创建

<color name="transparent">#00000000</color>

转到主题,打开 themes.xml 和 themes.xml(night) 并将此代码放在两个文件中,放在其中一个带有颜色的样式标签中。

<item name="android:statusBarColor" tools:targetApi="l">@color/transparent</item>

这是在 Android 上创建透明状态栏的简单方法。

答案 4 :(得分:1)

我用这个:https://stackoverflow.com/a/22192691/9957384

它有效,但也许在 compose 中有更好的解决方案。 为方便起见,我建议创建一个 Ambient

答案 5 :(得分:0)

   def version = "0.4.1"
implementation "dev.chrisbanes.accompanist:accompanist-coil:$version"
implementation "dev.chrisbanes.accompanist:accompanist-insets:$version"


class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    setContent {
        // A surface container using the 'background' color from the theme
        val systemUiController = remember { SystemUiController(window) }
        Providers(SysUiController provides systemUiController) {
            ProvideWindowInsets {
                val sysUiController = SysUiController.current

                onCommit(sysUiController, LightColorPalette2.uiBackground) {
                    sysUiController.setSystemBarsColor(
                        color = LightColorPalette2.uiBackground.copy(alpha = AlphaNearOpaque)
                    )
                }
                Surface(color = MaterialTheme.colors.background) {
                    Greeting("Android")
                }
            }
        }
    }
}

}

你还需要这个文件:

package com.example.myjetsnack

导入android.os.Build 导入 android.view.View 导入 android.view.Window 导入 androidx.compose.runtime.staticAmbientOf 导入 androidx.compose.ui.graphics.Color 导入 androidx.compose.ui.graphics.compositeOver 导入 androidx.compose.ui.graphics.luminance 导入 androidx.compose.ui.graphics.toArgb

接口 SystemUiController { 有趣的 setStatusBarColor( 颜色:颜色, darkIcons: Boolean = color.luminance() > 0.5f, transformColorForLightContent: (Color) -> Color = BlackScrimmed )

fun setNavigationBarColor(
    color: Color,
    darkIcons: Boolean = color.luminance() > 0.5f,
    transformColorForLightContent: (Color) -> Color = BlackScrimmed
)

fun setSystemBarsColor(
    color: Color,
    darkIcons: Boolean = color.luminance() > 0.5f,
    transformColorForLightContent: (Color) -> Color = BlackScrimmed
)

}

有趣的 SystemUiController(window: Window): SystemUiController { 返回 SystemUiControllerImpl(window) }

/**

  • 一个帮助类,用于优雅地设置 [Window] 的导航和状态栏颜色

  • 基于 API 级别的降级行为。 */ 私有类 SystemUiControllerImpl(private val window: Window) : SystemUiController {

    /**

    • 设置状态栏颜色。

    • @param color 要设置的期望 [颜色]。如果在

      上运行,这可能需要修改
    • 仅支持白色状态栏图标的 API 级别。

    • @param darkIcons 深色状态栏图标是否更可取。仅适用于

    • API 23+。

    • @param transformColorForLightContent 一个 lambda,如果

      将被调用以转换 [color]
    • 已请求深色图标但不可用。默认应用黑色稀松布。 */ 覆盖乐趣 setStatusBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ){ val statusBarColor = 当 { darkIcons && Build.VERSION.SDK_INT < 23 -> transformColorForLightContent(color) 其他 -> 颜色 } window.statusBarColor = statusBarColor.toArgb()

      如果 (Build.VERSION.SDK_INT >= 23) { @Suppress("弃用") 如果(深色图标){ window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 或 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } 别的 { window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 和 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() } } }

    /**

    • 设置导航栏颜色。

    • @param color 要设置的期望 [颜色]。如果在

      上运行,这可能需要修改
    • 仅支持白色导航栏图标的 API 级别。此外,这将被忽略

    • 和 [Color.Transparent] 将用于首选手势导航的 API 29+ 或

    • 系统 UI 会在其他导航模式下自动应用背景保护。

    • @param darkIcons 深色导航栏图标是否更可取。仅适用于

    • API 26+。

    • @param transformColorForLightContent 一个 lambda,如果

      将被调用以转换 [color]
    • 已请求深色图标但不可用。默认应用黑色稀松布。 */ 覆盖乐趣 setNavigationBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ){ val navBarColor = 当 { Build.VERSION.SDK_INT >= 29 -> Color.Transparent // 用于手势导航 darkIcons && Build.VERSION.SDK_INT < 26 -> transformColorForLightContent(color) 其他 -> 颜色 } window.navigationBarColor = navBarColor.toArgb()

      如果 (Build.VERSION.SDK_INT >= 26) { @Suppress("弃用") 如果(深色图标){ window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 或 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR } 别的 { window.decorView.systemUiVisibility = window.decorView.systemUiVisibility 和 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() } } }

    /**

    • 将状态栏和导航栏设置为 [color]。
    • @see setStatusBarColor
    • @see setNavigationBarColor */ 覆盖乐趣 setSystemBarsColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ){ setStatusBarColor(颜色,darkIcons,transformColorForLightContent) setNavigationBarColor(颜色,darkIcons,transformColorForLightContent) } }

/**

  • 一个 [androidx.compose.runtime.Ambient] 持有当前的 [SysUiController]。默认为一个
  • 无操作控制器;消费者应该 [provide][androidx.compose.runtime.Providers] 一个真实的。 */ val SysUiController = staticAmbientOf { 假系统用户界面控制器 }

private val BlackScrim = Color(0f, 0f, 0f, 0.2f) // 20% 不透明黑色 私人 val BlackScrimmed:(颜色)-> 颜色 = { 原始 -> BlackScrim.compositeOver(原创) }

/**

  • 一个虚假的实现,作为默认使用或在预览中使用。 */ 私有对象 FakeSystemUiController : SystemUiController { 覆盖乐趣 setStatusBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位

    覆盖乐趣 setNavigationBarColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位

    覆盖乐趣 setSystemBarsColor( 颜色:颜色, darkIcons:布尔值, transformColorForLightContent: (颜色) -> 颜色 ) = 单位 }