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

低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及以下版本可通过两种方式获取源色:

    1. 通过支持库提供的壁纸取色工具采样当前壁纸主色,需要根据系统版本申请对应壁纸/媒体读取权限
    2. 直接使用应用内置的品牌色、或用户手动选择的自定义颜色作为源色
  • 全系列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:36:19