You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码生成colorPrimaryDark并适配状态栏颜色与图标明暗?

嘿,这个需求在Android开发里太常见了,我来一步步给你拆解实用的解决方案:

1. 生成 colorPrimaryDark

按照Material Design规范,colorPrimaryDark是主色的深色变体,一般通过降低主色的亮度来实现(通常下调20%-30%,视觉效果最协调)。你可以直接借助AndroidX的ColorUtils工具类,或者手动通过HSV颜色模型调整,两种方式都很靠谱。

Kotlin实现示例:

import androidx.core.graphics.ColorUtils
import android.graphics.Color

// 手动调整HSV生成深色主色
fun generateColorPrimaryDark(primaryColor: Int): Int {
    val hsv = FloatArray(3)
    Color.colorToHSV(primaryColor, hsv)
    // 把亮度降到原有的70%,可根据需求在0.65-0.75之间调整比例
    hsv[2] *= 0.7f
    return Color.HSVToColor(hsv)
}

// 用ColorUtils的现成方法,内部逻辑和上面一致
fun generateColorPrimaryDarkWithUtils(primaryColor: Int): Int {
    return ColorUtils.darkenColor(primaryColor)
}

Java实现示例:

import androidx.core.graphics.ColorUtils;
import android.graphics.Color;

public static int generateColorPrimaryDark(int primaryColor) {
    float[] hsv = new float[3];
    Color.colorToHSV(primaryColor, hsv);
    hsv[2] *= 0.7f;
    return Color.HSVToColor(hsv);
}
2. 生成深色阴影色并设置为状态栏颜色

深色阴影色可以比colorPrimaryDark再暗一档,或者给主色叠加半透明黑色来模拟阴影质感。这里提供两种思路:

import androidx.core.graphics.ColorUtils
import android.graphics.Color

// 思路1:给主色叠加半透明黑色
fun generateStatusBarShadowColor(primaryColor: Int): Int {
    // 40%透明度的黑色叠加,alpha值(0-255)越大,阴影越重
    return ColorUtils.setAlphaComponent(primaryColor, (255 * 0.4).toInt())
}

// 思路2:在colorPrimaryDark基础上再降低亮度
fun generateStatusBarShadowColorV2(primaryColor: Int): Int {
    val darkPrimary = generateColorPrimaryDark(primaryColor)
    val hsv = FloatArray(3)
    Color.colorToHSV(darkPrimary, hsv)
    hsv[2] *= 0.9f // 再降10%亮度
    return Color.HSVToColor(hsv)
}

然后在Activity里设置状态栏颜色:

val primaryColor = ContextCompat.getColor(this, R.color.colorPrimary)
val statusBarColor = generateStatusBarShadowColor(primaryColor)
window.statusBarColor = statusBarColor
3. 自动适配状态栏图标的明暗

核心是判断状态栏颜色的相对亮度:颜色偏亮时用深色图标,偏暗时用亮色图标。借助ColorUtils.calculateLuminance()可以快速获取亮度值(范围0-1,0=纯黑,1=纯白),通常以0.5作为阈值。

Kotlin实现示例:

import androidx.core.graphics.ColorUtils
import android.view.View
import android.view.Window

fun adjustStatusBarIcons(window: Window, statusBarColor: Int) {
    val luminance = ColorUtils.calculateLuminance(statusBarColor)
    // 亮度>0.5说明颜色偏亮,启用深色图标
    val isLightStatusBar = luminance > 0.5f
    
    if (isLightStatusBar) {
        window.decorView.systemUiVisibility = 
            window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    } else {
        // 移除深色图标标记,恢复默认亮色图标
        window.decorView.systemUiVisibility = 
            window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
    }
}

整合使用

在Activity的onCreate里把所有逻辑串起来:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    val primaryColor = ContextCompat.getColor(this, R.color.colorPrimary)
    val statusBarShadowColor = generateStatusBarShadowColor(primaryColor)
    
    window.statusBarColor = statusBarShadowColor
    adjustStatusBarIcons(window, statusBarShadowColor)
}

注意:SYSTEM_UI_FLAG_LIGHT_STATUS_BAR仅在Android 6.0(API 23)及以上生效,低于该版本的系统状态栏图标默认是白色,无需额外处理。

内容的提问来源于stack exchange,提问作者Mohamed Zakaria El-Zoghbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:31