低SDK版本Android如何修改Material You/Material3动态配色
Android 低版本Material3动态配色程序化实现方案
Android 12(API 31)以下系统本身未提供原生动态取色能力,你看到的默认浅蓝/紫色是Material组件库内置的兜底配色,完全可以通过程序化方式生成全系列M3动态配色并全局应用,不需要在style.xml中硬编码全量色值,实现逻辑和高版本原生动态配色效果完全对齐。
具体实现步骤
依赖配置
首先确保引入1.10.0及以上版本的Material官方依赖库,低版本动态配色的核心能力已经内置在该版本中,不需要额外引入其他第三方库:dependencies { implementation "com.google.android.material:material:1.12.0" }所有页面的主题必须继承自Material3系列父主题,例如
Theme.Material3.DayNight.NoActionBar,不要混用Material2或AppCompat旧主题,否则配色替换会失效。源色获取
API 31及以上版本直接调用系统DynamicColors接口获取系统生成的动态源色即可;API 30及以下版本可通过两种方式获取源色:- 通过支持库提供的壁纸取色工具采样当前壁纸主色,需要根据系统版本申请对应壁纸/媒体读取权限
- 直接使用应用内置的品牌色、或用户手动选择的自定义颜色作为源色
全系列M3色板生成
拿到源色后,直接调用Material内置的色板生成方法,即可自动生成明暗两套模式下的全量M3配色变体,覆盖所有M3定义的色值层级(包括primary、onPrimary、primaryContainer、secondary等全部12组共上百个tonal梯度色值),生成逻辑和Android 12+系统原生动态配色算法完全一致:// 传入int类型的源色值,生成亮/暗色模式完整配色方案 val lightScheme = MaterialDynamicColors.lightColorScheme(sourceColor) val darkScheme = MaterialDynamicColors.darkColorScheme(sourceColor)全局注入配色
不需要修改style.xml,在基类Activity的onCreate回调、setContentView调用之前,判断系统版本执行配色注入即可:override fun onCreate(savedInstanceState: Bundle?) { val useDarkTheme = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { // 低版本注入自生成的动态配色 val targetScheme = if (useDarkTheme) darkScheme else lightScheme DynamicColors.applyToActivityIfAvailable(this) MaterialColorUtilities.bindColorScheme(this, targetScheme) } else { // 高版本直接使用系统原生动态配色 DynamicColors.applyToActivityIfAvailable(this) } super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) }
注意事项
- 不要在style.xml中硬编码M3相关的颜色属性,否则会覆盖程序化注入的动态配色
- 启动页(SplashScreen)需要单独同步配色配置,避免应用启动时短暂出现默认蓝紫色闪屏
- 如果需要支持多进程,所有进程的Activity都需要执行相同的配色注入逻辑,避免不同页面配色不一致
内容的提问来源于stack exchange,提问作者Yasiru Nayanajith
相关产品推荐
相关产品推荐

