让用户能够在您的应用中对颜色进行个性化设置

动态配色是在 Android 12 中添加的,可让用户对其设备进行个性化设置,使其与个人壁纸的配色方案或壁纸选择器中选择的颜色保持一致。

您可以通过添加 DynamicColors API 来利用此功能,该 API 会将此主题设置应用于您的应用或 activity,从而让您的应用对用户更具个性化。

图 1. 源自不同壁纸的色调配色方案示例

本页面包含有关在应用中实现动态配色的说明。您也可以为微件和自适应图标单独提供此功能,如本页后面部分所述。您也可以尝试使用 Codelab

Android 如何创建配色方案

Android 执行以下步骤,以根据用户的壁纸生成配色方案。

  1. 系统会检测所选壁纸图片中的主颜色,并提取源颜色。

  2. 系统会使用该源颜色进一步外推五种主要颜色,即“主色”、“次要”、“三级”、“中性”和“中性变体”。

    源颜色提取示例
    图 2. 从壁纸图片中提取源颜色并提取到五种主要颜色的示例
  3. 系统会将每种按键颜色解读为 13 种色调的调色板。

    生成指定色调调色板的示例
    图 3. 生成指定色调调色板的示例
  4. 系统会使用以下壁纸生成五种不同的配色方案,以便为所有浅色主题和深色主题提供基础。

不同颜色变体在用户设备上的显示方式

从 Android 12 开始,用户可以从壁纸提取的颜色和不同主题中选择颜色变体,Android 13 中添加了更多变体。例如,如果用户使用的是搭载 Android 13 的 Pixel 手机,则会从壁纸和样式设置中选择一个变体,如图 4 所示。

图 4. 在壁纸设置中选择颜色变体(在 Pixel 设备上显示)

在 Android 13 中,Android 12 添加了色调问题变体,接着在 Android 13 中又添加了中性色鲜艳色调富有表现力变体。每个变体都有一个独特的方案,该方案可通过生动和旋转色调来改变用户壁纸的种子颜色。以下示例展示了通过这四种颜色变体表示的单一配色方案。

图 5. 不同颜色变体在单个设备上的显示效果示例

您的应用仍会使用相同的令牌来访问这些颜色。如需详细了解令牌,请参阅本页面上的使用令牌创建主题

Compose 使用入门

如果您使用 Compose 构建界面,请参阅 Compose 中的 Material 主题设置,详细了解如何将动态配色应用于您的应用。

开始使用 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 Theme Builder(可通过 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() 一起发生。

图 6. 协调自定义颜色的示例

请参阅 Material 3 有关协调自定义颜色的指南。

将动态配色应用于自适应图标和微件

除了在应用中启用动态配色主题之外,您还可以为微件(从 Android 12 开始)和自适应图标(从 Android 13 开始)支持动态配色主题。