如何通过代码生成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
相关产品推荐
相关产品推荐

