Site icon AppTractor

Основы цветовой системы Material3 для Android-разработчиков

Material3 — это последняя итерация Material Design, с динамическим тематическим оформлением, обновленными компонентами и многим другим. Однако сам этот фреймворк может быть слишком подавляющим с его более чем 200 различными цветовыми вариантами и десятками страниц документации.

Хорошо, что на самом деле все не так сложно, и он может значительно облегчить жизнь разработчикам. И под облегчением я подразумеваю следующее:

И многое другое. В этой статье я расскажу, как работает система цветов Material3 и почему вы должны внедрить ее в свой Android-проект.

Понимание цветовых ролей Material3

Чтобы понять, как цвета применяются в вашем приложении, давайте немного вспомним, как устроена цветовая схема.

Цветовая схема Material3 состоит из трех высокоуровневых «цветовых ролей»: Primary, Secondary и Tertiary. Эти цвета применяются к компонентам в зависимости от их важности: FAB или кнопка «Вход» будут использовать основной цвет.

Основной цвет может быть основным цветом вашего бренда и поэтому используется для таких заметных компонентов, как основные кнопки. Вторичные цвета используются для акцентов, в то время как третичные встречаются реже.

Основы цветовой системы Material3 для Android-разработчиков

Диаграмма цветовых ролей

Вариации, например «On Primary», имеют правила применения: если ваша кнопка «Войти» использует основной цвет, то для текста на ней будет использоваться «On Primary». Соблюдение этих правил гарантирует, что ваше приложение будет читабельным и доступным.

Кнопка с фоном «Primary» и текстом «On Primary»

Почему это важно знать? Каждый компонент и каждое состояние имеют свои цвета, как описано в документации Material3. Простая кнопка имеет 7 состояний, каждое из которых имеет различные цвета. Вам не нужно беспокоиться о том, чтобы запомнить каждый из них!

Различные состояния и характеристики заполненной кнопки

Создание темы

Итак, как же объявить эти +200 цветов? Хорошая новость заключается в том, что это происходит практически автоматически. Вы точно не нужно создавать цветовую схему с нуля.

Есть два варианта: использовать плагин Material Theme Builder Figma или использовать онлайн Material Theme Builder.

Цвета, создаваемые конструктором Material Theme Builder

Оба конструктора работают одинаково:

  1. Выберите исходный цвет, и все остальные цвета будут автоматически выведены из него
  2. Экспортируйте сгенерированные .kt файлы
  3. Поместите файлы в пакет ui.theme в вашем проекте Compose
  4. Переименуйте AppTheme, если хотите

Вот и все! Теперь у вас есть полная кастомная система цветов Material3, примененная в вашем проекте.

Но как она работает?

За кулисами

Файл Theme.kt, который вы экспортировали, содержит следующий фрагмент кода:

@Composable
fun AppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable() () -> Unit
) {
  val colorScheme = when {
      darkTheme -> darkScheme
      else -> lightScheme
  }

  MaterialTheme(
    colorScheme = colorScheme,
    typography = AppTypography,
    content = content
  )
}

Здесь предопределенная colorScheme применяется к композиту MaterialTheme. Когда вы оборачиваете композабл элементы в свою тему, эти составные элементы получают доступ к colorScheme. Например, так можно применить тематизацию к @Previews.

@PreviewLightDark
@Composable
fun ButtonPreview() {
    AppTheme {
        Button(onClick = {}) {
            Text("This is onPrimary")
        }
    }
}

В приведенном выше фрагменте кода AppTheme передает определенный colorScheme кнопке через CompositionLocal. В результате получается полностью тематическая кнопка, поддерживающая режимы Light и Dark, без явного определения цветов.

Обратите внимание, что как фон, так и цвет текста отличаются.

Если вы посмотрите на исходный текст Material3 кнопки, то увидите, что по умолчанию для цветов используется значение ButtonDefaults.buttonColors(). Функция buttonColors() получает эти цвета из вашей MaterialTheme:

@Composable fun buttonColors() = MaterialTheme.colorScheme.defaultButtonColors

Где применяются цвета?

Как вы уже догадались, цвета применяются ко всем компонентам Material3 и их состояниям, от простой Button до сложного TimePicker.

Темы

Как видно из приведенного выше, вы получите цвета как для темной, так и для светлой темы.

Таким образом, следующий фрагмент кода приводит к созданию полностью тематического компонента TimePicker, как для темной, так и для светлой темы.

@PreviewLightDark
@Composable
fun TimePickerPreview() {
    AppTheme {
        Surface {
            TimePicker(
                state = rememberTimePickerState(
                    initialHour = 11,
                    initialMinute = 11,
                    is24Hour = true,
                )
            )
        }
    }
}

В результате получаются следующие превью:

TimePicker в светлой и темной темах

Состояния

А различные состояния? Да, цвета также автоматически применяются в зависимости от состояния.

Включенная и выключенная кнопка

Как видно из приведенного ниже фрагмента кода, изменение цвета фона кнопки и ее надписи напрямую зависит от свойства кнопки enabled:

@PreviewLightDark
@Composable
fun ButtonPreview() {
    ComposeColorsTheme {
        Surface {
            Row {
                Button(
                    onClick = {},
                    enabled = true
                ) {
                    Text("Login")
                }
                Button(
                    onClick = {},
                    enabled = false
                ) {
                    Text("Cancel")
                }
            }
        }
    }
}

Резюме

Реализация цветовой системы Material3 может показаться пугающей, но, используя компоненты Material Theme Builder и Material3 Compose, вы обнаружите, что тематизация намного проще и понятнее, чем без их использования.

И, как любят все разработчики, в итоге вы получите чистую кодовую базу и изысканную цветовую схему во всем приложении.

Ссылки

Если вы хотите узнать больше, вот несколько полезных ссылок:

Источник

Exit mobile version