【问题标题】:Set status bar color gradient matching the content background gradient in Jetpack Compose在 Jetpack Compose 中设置状态栏颜色渐变匹配内容背景渐变
【发布时间】:2023-01-07 16:38:31
【问题描述】:

我的问题就像图片

我这样设置状态栏颜色:

 val systemUiController = rememberSystemUiController()
    SideEffect {
        systemUiController.setStatusBarColor(
            color = Color(0xFFA784FB)
        )
    }

我的顶栏

@Composable
fun ProminentTopAppBarWithImage() {
    TopAppBar(
        modifier = Modifier.height(200.dp),
        contentPadding = PaddingValues(all = 0.dp) // (1)
    ) {
        Box(modifier = Modifier.fillMaxSize().background(SaveDoneBackGroundGradient)) { // (2)
            Row( // (4)
                modifier = Modifier
                    .fillMaxSize()
                    .padding(horizontal = 4.dp) // (5)
            ) {
                /*...*/
            }
        }
    }
}

这个问题有什么解决办法吗?

【问题讨论】:

    标签: android kotlin android-jetpack-compose gradient android-statusbar


    【解决方案1】:

    我认为状态栏具有并匹配内容的渐变颜色的唯一方法是求助于旧窗口/可绘制配置。

    从这个post 中获取想法,你必须创建一个 xml drawable 来匹配颜色方向您在可组合容器/布局中使用的渐变背景。

    res/drawable/gradient_horizontal.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <gradient
            android:type="linear"
            android:angle="0"
            android:startColor="#9881de"
            android:endColor="#6b50ba"  />
    </shape>
    

    并具有此窗口配置,您将在其中将 drawable 设置为窗口背景

    fun gradientStatusBar(activity: Activity) {
        val window: Window = activity.window
        val background = ContextCompat.getDrawable(activity, R.drawable.gradient_horizontal)
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    
        window.statusBarColor = ContextCompat.getColor(activity,android.R.color.transparent)
        window.navigationBarColor = ContextCompat.getColor(activity,android.R.color.transparent)
        window.setBackgroundDrawable(background)
    }
    

    然后在你的活动中调用它

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            gradientStatusBar(this) // call it here
            setContent {
                Box(
                    modifier = Modifier
                        .fillMaxSize()
                        .background(
                            brush = Brush.horizontalGradient(
                                colors = listOf(
                                    Color(0xFF9881de),
                                    Color(0xFF6b50ba)
                                )
                            )
                        )
                )
    ...
    

    你会得到这样的东西

    如果您想更改所有内容并保持状态栏和内容的统一外观,您只需调整可绘制对象和背景渐变颜色/方向。

    【讨论】:

    • 你弄错了,我只想让一个屏幕有那个渐变状态栏颜色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2022-12-21
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多