Pozwól użytkownikom spersonalizować korzystanie z kolorów w Twojej aplikacji

Wypróbuj tworzenie wiadomości
Jetpack Compose to zalecany zestaw narzędzi interfejsu na Androida. Dowiedz się, jak pracować z kolorem dynamicznym w edytorze.

Funkcja Dynamic Color (wprowadzona w Androidzie 12) umożliwia użytkownikom personalizację urządzeń, aby były zgodne ze schematem kolorów osobistej tapety lub za pomocą wybranego koloru w selektorze tapet.

Możesz skorzystać z tej funkcji, dodając interfejs API DynamicColors, który zastosuje ten motyw do aplikacji lub aktywności, aby lepiej spersonalizować aplikację pod kątem użytkownika.

Rysunek 1. Przykłady schematów kolorystycznych wyodrębnionych z różnych tapet

Ta strona zawiera instrukcje wdrażania kolorów dynamicznych w aplikacji. Ta funkcja jest też dostępna oddzielnie w przypadku widżetów i ikon adaptacyjnych, co opisaliśmy poniżej. Możesz też wypróbować ćwiczenie z programowania.

Jak Android tworzy schematy kolorów

Aby wygenerować motywy kolorów na podstawie tapety użytkownika, Android wykonuje te czynności:

  1. System wykrywa główne kolory wybranego obrazu tapety i wyodrębnia źródłowy kolor.

  2. System używa tego koloru źródłowego do dalszego ekstrapolowania 5 kluczowych kolorów: głównego, dodatkowego, dodatkowego, neutralnego i wariantu neutralnego.

    Przykład wyodrębniania kolorów źródłowych
    Rysunek 2. Przykład wyodrębniania kolorów źródłowych z obrazu tapety i wyodrębniania 5 kluczowych kolorów
  3. System interpretuje każdy kolor klawiszy na paletę 13 tonów.

    Przykład generowania danej palety barw
    Rysunek 3. Przykład generowania określonych palet tonalnych
  4. System używa tej pojedynczej tapety do wyliczania 5 różnych schematów kolorów, które stanowią podstawę do tworzenia motywów jasnych i ciemnych.

Sposób wyświetlania wariantów kolorów na urządzeniu użytkownika

Od Androida 12 użytkownicy mogą wybierać warianty kolorów wyodrębnionych z tapety i różne motywy, a w Androidzie 13 dodano jeszcze więcej wariantów. Na przykład użytkownik telefonu Pixel z Androidem 13 może wybrać wariant w ustawieniach Tapeta i styl, jak pokazano na rysunku 4.

Rysunek 4. Wybieranie wariantów kolorystycznych w ustawieniach tapety (na urządzeniu Pixel)

W Androidzie 12 dodano wariant Tonal Spot, a w Androidzie 13 – warianty Neutralny, Jasny tonalnyWyrazisty. Każda wersja ma unikalną recepturę, która zmienia kolory początkowe tapety użytkownika za pomocą intensywności i obrotu odcienia. W tym przykładzie pokazano jedną paletę kolorów wyrażoną za pomocą 4 wariantów kolorystycznych.

Rysunek 5. Przykłady różnych wersji kolory na jednym urządzeniu

Twoja aplikacja nadal używa tych samych tokenów do uzyskiwania dostępu do tych kolorów. Szczegółowe informacje o tokenach znajdziesz w sekcji Tworzenie motywu za pomocą tokenów na tej stronie.

Pierwsze kroki z widokami

Dynamiczną kolorystykę możesz zastosować na poziomie aplikacji lub aktywności. Aby to zrobić, zadzwoń pod numer applyToActivitiesIfAvailable(), aby zarejestrować ActivityLifeCycleCallbacks w aplikacji.

KotlinJava
class MyApplication: Application() {
    override fun onCreate() {
        DynamicColors.applyToActivitiesIfAvailable(this)
    }
}
public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    DynamicColors.applyToActivitiesIfAvailable(this);
  }
}

Następnie dodaj motyw do aplikacji.

<style
    name="AppTheme"
    parent="ThemeOverlay.Material3.DynamicColors.DayNight">
    ...
</style>

Tworzenie motywu za pomocą tokenów

Dynamiczna zmiana kolorów korzysta z tokenów projektu, aby ułatwić i ujednolicić przypisywanie kolorów do różnych elementów interfejsu. Token projektu umożliwia przypisywanie różnych ról kolorów (a nie wartości) do różnych elementów interfejsu. Dzięki temu system tonalny aplikacji będzie bardziej elastyczny, skalowalny i spójny. Jest to szczególnie przydatne podczas projektowania motywów jasnych i ciemnych oraz kolorów dynamicznych.

Poniższe fragmenty kodu po zastosowaniu dynamicznych tokenów kolorów przedstawiają przykłady motywów jasnego i ciemnego oraz odpowiadający kod XML kolorów.

Jasny motyw

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>

Ciemny motyw

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>

Kolory 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>

Więcej informacji:

  • Więcej informacji o dynamicznych kolorach, kolorach niestandardowych i generowaniu tokenów znajdziesz na stronie Dynamiczne kolory w Material 3.

  • Aby wygenerować podstawową paletę kolorów oraz kolory i motyw aplikacji, skorzystaj z narzędzia Material Theme Builder, dostępnego w pluginie Figma lub w przeglądarce.

  • Więcej informacji o tym, jak schematy kolorów mogą zwiększać ułatwienia dostępu w aplikacji, znajdziesz na stronie Material 3 poświęconej ułatwieniom dostępu w systemie kolorów.

Zachowaj kolory niestandardowe lub marki

Jeśli aplikacja ma kolory niestandardowe lub marki, których nie chcesz zmieniać zgodnie z preferencjami użytkownika, możesz dodać je pojedynczo podczas tworzenia schematu kolorów. Na przykład:

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>

Możesz też użyć kreatora motywów Material, aby zaimportować dodatkowe kolory, które rozszerzą Twój schemat kolorów, tworząc w ten sposób ujednolicony system kolorów. W przypadku tej opcji użyj HarmonizedColors, aby zmienić ton niestandardowych kolorów. W połączeniu z kolorami tworzonymi przez użytkowników zachowuje to wizualną równowagę i przystępny kontrast. Występuje w czasie wykonywania kodu: applyToContextIfAvailable().

Rysunek 6. Przykład harmonizacji kolorów niestandardowych

Zapoznaj się z wytycznymi Material 3 dotyczącymi harmonijnego doboru kolorów niestandardowych.

Zastosuj dynamiczne kolory do adaptacyjnych ikon i widżetów

Oprócz włączenia motywów dynamicznych w aplikacji możesz też obsługiwać motywy dynamiczne w widżetach od Androida 12 oraz w adaptacyjnych ikonach od Androida 13.