如何检测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
相关产品推荐
相关产品推荐

