讓使用者在應用程式中自訂色彩體驗

Android 12 新增的動態色彩可讓使用者根據個人桌布的色彩配置,或透過桌布挑選器中的所選顏色,自訂裝置風格。

您可以透過新增 DynamicColors API 來使用這項功能,將主題套用至應用程式或活動,讓應用程式更貼近使用者需求。

圖 1 擷取自不同桌布的色調色彩配置示例

本頁提供在應用程式中實作動態色彩的操作說明。此外,這項功能也適用於小工具和自動調整圖示,詳情請參閱本頁後續內容。您也可以使用程式碼研究室

Android 如何建立色彩配置

Android 會執行下列步驟,從使用者的桌布產生色彩配置。

  1. 系統會偵測所選桌布圖片的主要顏色,並擷取「來源」顏色。

  2. 系統會使用該來源顏色進一步推斷五個主要顏色,分別是「Primary」、「Secondary」、「Tertiary」、「Neutral」和「Neutral variant」

    來源顏色擷取範例
    圖 2. 從桌布圖片和擷取到五種主要顏色的來源色彩擷取示例
  3. 系統會將每個按鍵顏色解讀為 13 種色調的色調調色盤。

    產生指定色調調色盤的範例
    圖 3 產生指定色調調色盤的範例
  4. 系統會用這張桌布衍生五種色彩配置,為淺色和深色主題提供基礎。

色彩變化版本在使用者裝置上的顯示方式

自 Android 12 起,使用者可以從桌布擷取顏色和不同主題中選取顏色變化版本,並在 Android 13 中新增更多變化版本。舉例來說,使用者若使用搭載 Android 13 的 Pixel 手機,就會從「桌布和樣式」設定中選取變化版本,如圖 4 所示。

圖 4:在桌布設定中選取色彩變化版本 (顯示在 Pixel 裝置上)

Android 12 會在 Android 13 中新增「Tonal Spot」變化版本,後面接著「Neutral」、「Vibrant Tonal」和「Expressive」變化版本。每個變化版本都有獨特的方案,可透過鮮明的色彩轉換使用者桌布的種子顏色,並旋轉色調。以下範例顯示透過這四個顏色子類表示的單一色彩配置。

圖 5 不同顏色子類在單一裝置上呈現的示例

您的應用程式仍會使用相同的符記來存取這些顏色。如要進一步瞭解符記,請參閱本頁的「使用權杖建立主題」。

開始使用 Compose

如果您使用 Compose 建構 UI,請參閱 Compose 中的 Material Design 主題設定,進一步瞭解如何為應用程式套用動態色彩。

開始使用 View

您可以在應用程式或活動層級套用動態色彩。方法是呼叫 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>

使用權杖建立主題

動態色彩會使用設計符記,讓不同 UI 元素的顏色更簡潔一致。設計權杖可讓您透過語意為 UI 的不同元素指派顏色角色,而非設定值。如此可讓應用程式的色調系統擁有更高的彈性、擴充性和一致性,而且在設計淺色、深色主題和動態色彩時特別實用。

以下程式碼片段顯示套用動態色彩符記後的淺色和深色主題範例,以及對應的顏色 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 動態色彩頁面。

  • 如要產生基本調色盤和應用程式的顏色和主題,請查看質感設計主題建構工具,此應用程式可透過 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>

或者,您也可以使用質感設計主題建構工具匯入其他色彩配置擴充色彩配置,進而建立統一的色彩系統。選取這個選項時,請使用 HarmonizedColors 轉移自訂顏色的色調。這可以在與使用者產生的色彩搭配使用時,達到視覺平衡和易於理解的對比效果。會在執行階段透過 applyToContextIfAvailable() 進行。

圖 6:協調自訂顏色的範例

請參閱 Material 3 的「調和自訂顏色」指南。

為自動調整圖示和小工具套用動態色彩

除了在應用程式中啟用動態色彩主題設定之外,從 Android 12 以上版本開始,小工具還能支援動態色彩主題設定,自 Android 13 起支援自動調整圖示