动态配色是在 Android 12 中添加的,可让用户对其设备进行个性化设置,使其与个人壁纸的配色方案或壁纸选择器中选择的颜色保持一致。
您可以通过添加 DynamicColors
API 来利用此功能,该 API 会将此主题应用于您的应用或 activity,以便为用户提供更加个性化的应用。
本页介绍了如何在应用中实现动态配色。此功能还可单独用于微件和自适应图标,如本页稍后所述。您也可以尝试使用 Codelab。
Android 如何创建配色方案
Android 执行以下步骤,以根据用户的壁纸生成配色方案。
系统会检测所选壁纸图片中的主色,并提取源颜色。
系统会使用该源颜色进一步推断出五种关键颜色,分别称为主色、辅色、第三色、中性色和中性变体。
系统会将每种关键颜色解读为 13 种色调的调色板。
系统会使用这张单一壁纸派生出五种不同的配色方案,为任何浅色和深色主题奠定基础。
颜色变体在用户设备上的显示方式
从 Android 12 开始,用户可以从壁纸提取的颜色和不同的主题中选择颜色变体,Android 13 中还添加了更多变体。例如,使用搭载 Android 13 的 Pixel 手机的用户可以从壁纸和样式设置中选择变体,如图 4 所示。
Android 12 添加了色调点变体,Android 13 中随后又添加了中性、鲜艳色调和富有表现力变体。每个变体都有一个独特的配方,可通过调整饱和度和旋转色相来转换用户壁纸的种子颜色。以下示例展示了通过这四种颜色变体表达的单一配色方案。
您的应用仍会使用相同的令牌来访问这些颜色。如需详细了解令牌,请参阅本页中的使用令牌创建主题。
View 使用入门
您可以在应用级别或 activity 级别应用动态配色。为此,请调用 applyToActivitiesIfAvailable()
将 ActivityLifeCycleCallbacks
注册到您的应用。
Kotlin
class MyApplication: Application() { override fun onCreate() { DynamicColors.applyToActivitiesIfAvailable(this) } }
Java
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); DynamicColors.applyToActivitiesIfAvailable(this); } }
接下来,将主题添加到您的应用。
<style
name="AppTheme"
parent="ThemeOverlay.Material3.DynamicColors.DayNight">
...
</style>
使用令牌创建主题
动态配色利用设计令牌,使为不同界面元素分配颜色更精简、更一致。借助设计令牌,您可以为界面的不同元素语义上分配颜色角色,而不是分配设定的值。这使应用的色调系统具有更高的灵活性、可伸缩性和一致性,在针对浅色和深色主题以及动态配色进行设计时尤其强大。
以下代码段展示了应用动态配色令牌后的浅色和深色主题示例,以及相应的颜色 XML。
浅色主题
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
…..
</style>
</resources>
深色主题
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
<item name="colorError">@color/md_theme_dark_error</item>
<item name="colorOnError">@color/md_theme_dark_onError</item>
<item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
……
</style>
</resources>
颜色 XML
Colors.xml
<resources>
<color name="md_theme_light_primary">#6750A4</color>
<color name="md_theme_light_onPrimary">#FFFFFF</color>
<color name="md_theme_light_primaryContainer">#EADDFF</color>
<color name="md_theme_light_onPrimaryContainer">#21005D</color>
<color name="md_theme_light_error">#B3261E</color>
<color name="md_theme_light_onError">#FFFFFF</color>
<color name="md_theme_light_errorContainer">#F9DEDC</color>
<color name="md_theme_light_onErrorContainer">#410E0B</color>
<color name="md_theme_light_surface">#FFFBFE</color>
<color name="md_theme_light_onSurface">#1C1B1F</color>
<color name="md_theme_light_surfaceVariant">#E7E0EC</color>
<color name="md_theme_dark_primary">#D0BCFF</color>
<color name="md_theme_dark_onPrimary">#381E72</color>
<color name="md_theme_dark_primaryContainer">#4F378B</color>
<color name="md_theme_dark_onPrimaryContainer">#EADDFF</color>
<color name="md_theme_dark_secondary">#CCC2DC</color>
<color name="md_theme_dark_onSecondary">#332D41</color>
<color name="md_theme_dark_secondaryContainer">#4A4458</color>
<color name="md_theme_dark_onSurface">#E6E1E5</color>
<color name="md_theme_dark_surfaceVariant">#49454F</color>
</resources>
更多信息:
如需详细了解动态配色、自定义颜色和生成令牌,请参阅 Material 3 动态配色页面。
如需生成基本调色板以及应用的颜色和主题,请查看 Material 主题构建器(可通过 Figma 插件或在浏览器中使用)。
如需详细了解如何通过使用配色方案在应用中实现更好的无障碍功能,请参阅 Material 3 中有关颜色系统无障碍的页面。
保留自定义颜色或品牌颜色
如果您不想根据用户的偏好设置更改应用的自定义颜色或品牌颜色,则可以在构建配色方案时单独添加这些颜色。例如:
Themes.xml
<resources>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
...
<item name="home_lamp">@color/home_yellow</item>
...
</style>
</resources>
Colors.xml
<resources>
<color name="home_yellow">#E8D655</color>
</resources>
或者,您也可以使用 Material Theme Builder 导入可扩展配色方案的其他颜色,从而创建统一的颜色系统。如果使用此选项,请使用 HarmonizedColors
改变自定义颜色的色调。与用户生成的颜色结合使用时,可实现视觉平衡和易于理解的对比度。它会在运行时与 applyToContextIfAvailable()
一起发生。
请参阅 Material 3 中有关协调自定义颜色的指南。
将动态配色应用于自适应图标和微件
除了在应用中启用动态配色主题外,从 Android 12 开始,您还可以为微件启用动态配色主题,从 Android 13 开始,还可以为自适应图标启用动态配色主题。