如何在Jetpack Compose应用中获取安卓系统设置APP使用的动态背景色?
如何在Jetpack Compose应用中获取安卓系统设置APP使用的动态背景色?
我太懂你要找的这个颜色了!就是系统设置APP里的那个动态背景——尤其是深色主题下,它比Compose默认的Background、Surface色要稍微亮一丢丢,而且确实不在Compose自带的Dynamic Color Scheme里,一开始找起来真的挺懵的对吧?
你之前尝试用android.R.color.system_surface_dim_dark直接拿颜色,结果不对,其实问题出在:系统设置APP根本不是直接用这个颜色ID的,它是通过系统主题属性来引用的,直接取颜色ID会跳过动态色的适配逻辑,所以拿到的颜色和设置APP里的不一样。
给你说个正确的姿势:
- 系统设置APP里的这个背景色,对应的是系统主题属性
?android:attr/systemSurfaceDim(深色模式下系统会自动映射到对应的动态暗色值) - 在Compose里,我们需要通过上下文的主题来解析这个属性,而不是直接调用
colorResource
直接上代码,复制就能用:
import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import android.content.Context import android.util.TypedValue // 封装成工具函数 fun getSystemSettingsBgColor(context: Context): Color { val typedValue = TypedValue() // 从系统主题中解析systemSurfaceDim属性 context.theme.resolveAttribute(android.R.attr.systemSurfaceDim, typedValue, true) return Color(typedValue.data) } // 在你的Composable里使用 @Composable fun SettingsStyleScreen() { val context = LocalContext.current val settingsBgColor = getSystemSettingsBgColor(context) // 用这个颜色当背景 Box(modifier = Modifier.fillMaxSize().background(settingsBgColor)) { // 这里放你的界面内容 } }
另外如果要兼容API 35以下的设备,可以加个版本判断, fallback到Compose Material3里的surfaceDim颜色,毕竟这个属性是API 35才新增的:
fun getSystemSettingsBgColor(context: Context): Color { return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { val typedValue = TypedValue() context.theme.resolveAttribute(android.R.attr.systemSurfaceDim, typedValue, true) Color(typedValue.data) } else { // 低版本用Material3的surfaceDim近似替代 androidx.compose.material3.MaterialTheme.colorScheme.surfaceDim } }
这样拿到的颜色就和系统设置APP里的动态背景色完全一致啦,会跟着你的系统动态色主题(比如壁纸调色)自动变化~
备注:内容来源于stack exchange,提问作者Lexip
相关产品推荐
相关产品推荐

