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

如何检测Android 14动态色彩的单色/灰度模式并适配UI?

Android 14 单色/灰度模式检测与适配方案

一、检测单色模式状态

Android 14 新增了专门的API用于识别系统是否处于单色主题模式,具体实现方式如下:

1. 直接获取模式状态

通过UiModeManager可以直接判断当前是否启用单色模式:

val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
val isMonochromeEnabled = uiModeManager.nightMode == UiModeManager.MODE_NIGHT_MONOCHROME

2. 实时监听模式切换

若需在模式切换时即时更新UI,可通过onConfigurationChanged回调监听:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
    val isMonochrome = uiModeManager.nightMode == UiModeManager.MODE_NIGHT_MONOCHROME
    // 根据状态触发UI调整逻辑
    adjustUiForMonochrome(isMonochrome)
}

二、将非系统色彩UI转为灰度

对于未使用R.color.system_*系列资源的UI元素(如自定义图片),可通过以下方式实现灰度化:

1. 图片视图直接设置灰度滤镜

给ImageView添加饱和度为0的颜色矩阵滤镜:

fun toggleImageGrayscale(imageView: ImageView, enable: Boolean) {
    imageView.colorFilter = if (enable) {
        val matrix = ColorMatrix().apply { setSaturation(0f) }
        ColorMatrixColorFilter(matrix)
    } else {
        null
    }
}

2. Drawable资源灰度化处理

针对Drawable对象,借助DrawableCompat统一处理滤镜:

fun updateDrawableGrayscale(drawable: Drawable, isGrayscale: Boolean) {
    val wrappedDrawable = DrawableCompat.wrap(drawable)
    if (isGrayscale) {
        val matrix = ColorMatrix().apply { setSaturation(0f) }
        DrawableCompat.setColorFilter(wrappedDrawable, ColorMatrixColorFilter(matrix))
    } else {
        DrawableCompat.clearColorFilter(wrappedDrawable)
    }
}

3. 全局主题辅助适配(可选)

在应用主题中添加android:forceDarkAllowed="true",可让系统自动处理部分原生UI的灰度转换,但自定义图片仍需手动实现滤镜逻辑。


内容的提问来源于stack exchange,提问作者Ebrahim Byagowi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:19:55