Переход с Material 2.5 на Material 3 в Compose для Wear OS

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

В этом руководстве основное внимание уделяется переходу с библиотеки Wear Compose Material 2.5 (androidx.wear.compose) Jetpack на библиотеку Wear Compose Material 3 (androidx.wear.compose.material3) Jetpack для приложений.

Подходы

Для переноса кода приложения с M2.5 на M3 следуйте тому же подходу, который описан в руководстве по переносу Compose Material на телефон , в частности:

Зависимости

M3 имеет отдельный пакет и версию для M2.5:

М2.5

implementation("androidx.wear.compose:compose-material:1.4.0")

М3

implementation("androidx.wear.compose:compose-material3:1.5.0-beta01")

Последние версии M3 смотрите на странице релизов Wear Compose Material 3 .

Версия библиотеки Wear Compose Foundation 1.5.0-beta01 представляет несколько новых компонентов, которые предназначены для работы с компонентами Material 3. Аналогично, SwipeDismissableNavHost из библиотеки Wear Compose Navigation имеет обновленную анимацию при работе на Wear OS 6 (уровень API 36) или выше. При обновлении до версии Wear Compose Material 3 мы также рекомендуем обновить библиотеки Wear Compose Foundation и Navigation:

implementation("androidx.wear.compose:compose-foundation:1.5.0-beta01")
implementation("androidx.wear.compose:compose-navigation:1.5.0-beta01")

Тематика

В M2.5 и M3 тема компонуется под названием MaterialTheme , но пакеты импорта и параметры различаются. В M3 параметр Colors был переименован в ColorScheme , а MotionScheme был введен для реализации переходов.

М2.5

import androidx.wear.compose.material.MaterialTheme

MaterialTheme(
        colors = AppColors,
        typography = AppTypography,
        shapes = AppShapes,
        content = content
)

М3

import androidx.wear.compose.material3.MaterialTheme

MaterialTheme(
        colorScheme = AppColorScheme,
        typography = AppTypography,
        shapes = AppShapes,
        motionScheme = AppMotionScheme,
        content = content
)

Цвет

Цветовая система в M3 существенно отличается от M2.5. Количество цветовых параметров увеличилось, они имеют другие названия и по-разному сопоставляются с компонентами M3. В Compose это относится к классу M2.5 Colors , классу M3 ColorScheme и связанным функциям:

М2.5

import androidx.wear.compose.material.Colors

val appColorScheme: Colors = Colors(
   // M2.5 Color parameters
)

М3

import androidx.wear.compose.material3.ColorScheme

val appColorScheme: ColorScheme = ColorScheme(
   // M3 ColorScheme parameters
)

В следующей таблице описаны основные различия между M2.5 и M3:

М2.5

М3

Color

переименован в ColorScheme

13 цветов

28 цветов

Н/Д

новая динамическая цветовая тема

Н/Д

новые третичные цвета для большей выразительности

Динамическая цветовая тематика

Новая функция в M3 — динамическая цветовая тема . Если пользователи меняют цвета циферблата, цвета в пользовательском интерфейсе меняются в соответствии с ними.

Используйте функцию dynamicColorScheme для реализации динамической цветовой схемы и предоставления defaultColorScheme в качестве запасного варианта на случай, если динамическая цветовая схема недоступна.

@Composable
fun myApp() {
  val myColorScheme = myBrandColors()
  val dynamicColorScheme = dynamicColorScheme(LocalContext.current)
  MaterialTheme(colorScheme = dynamicColorScheme ?: myBrandColors) {...}
}

Типографика

Система типографики в M3 отличается от M2 и включает в себя следующие особенности:

  • Девять новых стилей текста
  • Flex-шрифты, позволяющие настраивать масштаб шрифта для различной толщины, ширины и округлости.
  • AnimatedText , который использует гибкие шрифты

М2.5

import androidx.wear.compose.material.Typography

val Typography = Typography(
   // M2.5 TextStyle parameters
)

М3

import androidx.wear.compose.material3.Typography

val Typography = Typography(
   // M3 TextStyle parameters
)

Flex-шрифты

Flex Fonts позволяют дизайнерам указывать ширину и насыщенность шрифта для определенных размеров.

Текстовые стили

В M3 доступны следующие стили текста . Они используются по умолчанию различными компонентами M3.

Типографика

ТекстовыйСтиль

Отображать

displayLarge, displayMedium, displaySmall

Заголовок

titleБольшой, titleСредний, titleМаленький

Этикетка

labelБольшой, labelСредний, labelМаленький

Тело

bodyLarge, bodyMedium, bodySmall, bodyExtraSmall

Цифра

цифраОчень большой, цифраБольшой, цифраСредний, цифраМаленький, цифраОчень маленький

Дуга

arcLarge, arcMedium, arcSmall

Форма

Система форм в M3 отличается от M2. Количество параметров форм увеличилось, они называются по-другому и по-другому отображаются в компонентах M3. Доступны следующие размеры форм:

  • Очень маленький
  • Маленький
  • Середина
  • Большой
  • Очень большой

В Compose это применяется к классу M2 Shapes и классу M3 Shapes :

М2.5

import androidx.wear.compose.material.Shapes

val Shapes = Shapes(
   // M2.5 Shapes parameters
)

М3

import androidx.wear.compose.material3.Shapes

val Shapes = Shapes(
   // M3 Shapes parameters
)

В качестве отправной точки используйте сопоставление параметров Shapes из Migrate from Material 2 to Material 3 в Compose .

Изменение формы

M3 представляет функцию изменения формы: формы теперь меняются в ответ на взаимодействия.

Поведение Shape Morphing доступно в виде вариации для ряда круглых кнопок, см. ниже:

Кнопки

Функция изменения формы

IconButton

IconButtonDefaults.animatedShape() анимирует кнопку со значком при нажатии

IconToggleButton

IconToggleButtonDefaults.animatedShape() анимирует кнопку переключения значка при нажатии и

IconToggleButtonDefaults.variantAnimatedShapes() анимирует кнопку переключения значка при нажатии и установке/снятии отметки

TextButton

TextButtonDefaults.animatedShape() анимирует текстовую кнопку при нажатии

TextToggleButton

TextToggleButtonDefaults.animatedShapes() анимирует переключение текста при нажатии, а TextToggleButtonDefaults.variantAnimatedShapes() анимирует переключение текста при нажатии и установке/снятии отметки.

Компоненты и компоновка

Большинство компонентов и макетов из M2.5 доступны в M3. Однако некоторые компоненты и макеты M3 не существовали в M2.5. Более того, некоторые компоненты M3 имеют больше вариаций, чем их эквиваленты в M2.5.

Хотя некоторые компоненты требуют особого внимания, в качестве отправной точки рекомендуются следующие сопоставления функций:

Материал 2.5

Материал 3

androidx.wear.compose.material.dialog.Оповещение

androidx.wear.compose.material3.AlertDialog

androidx.wear.compose.material.Кнопка

androidx.wear.compose.material3.IconButton или androidx.wear.compose.material3.TextButton

androidx.wear.compose.material.Карта

androidx.wear.compose.material3.Карта

androidx.wear.compose.material.TitleCard

androidx.wear.compose.material3.TitleCard

androidx.wear.compose.material.AppCard

androidx.wear.compose.material3.AppCard

androidx.wear.compose.material.Флажок

Нет эквивалента M3, перейдите на androidx.wear.compose.material3.CheckboxButton или androidx.wear.compose.material3.SplitCheckboxButton

androidx.wear.compose.material.Чип

androidx.wear.compose.material3.Button или
androidx.wear.compose.material3.OutlinedButton или
androidx.wear.compose.material3.FilledTonalButton или
androidx.wear.compose.material3.ChildButton

androidx.wear.compose.material.CompactChip

androidx.wear.compose.material3.CompactButton

androidx.wear.compose.material.InlineSlider

androidx.wear.compose.material3.Slider

androidx.wear.compose.material.LocalContentAlpha

Был удален, так как не использовался в Text или Icon в материале 3.

androidx.wear.compose.material.PositionIndicator

androidx.wear.compose.material3.Индикатор прокрутки

androidx.wear.compose.material.RadioButton

Нет эквивалента M3, переходите на androidx.wear.compose.material3.RadioButton или androidx.wear.compose.material3.SplitRadioButton

androidx.wear.compose.material.Проведите пальцем, чтобы показать карту

androidx.wear.compose.material3.Проведите пальцем, чтобы показать

androidx.wear.compose.material.Проведите пальцем, чтобы показать чип

androidx.wear.compose.material3.Проведите пальцем, чтобы показать

android.wear.compose.material.Scaffold

androidx.wear.compose material3.AppScaffold и androidx.wear.compose.material3.ScreenScaffold

androidx.wear.compose.material.SplitToggleChip

Нет эквивалента M3, перейдите на androidx.wear.compose.material3.SplitCheckboxButton , androidx.wear.compose.material3.SplitSwitchButton или androidx.wear.compose.material3.SplitRadioButton

androidx.wear.compose.material.Switch

Нет эквивалента M3, переходите на androidx.wear.compose.material3.SwitchButton или androidx.wear.compose.material3.SplitSwitchButton

androidx.wear.compose.material.ToggleButton

androidx.wear.compose.material3.IconToggleButton или androidx.wear.compose.material3.TextToggleButton

androidx.wear.compose.material.ToggleChip

androidx.wear.compose.material3.CheckboxButton или
androidx.wear.compose.material3.RadioButton или
androidx.wear.compose.material3.Кнопка переключения

androidx.wear.compose.material.Виньетка

Удалено, так как не включено в Material 3 Expressive design для Wear OS

Вот полный список всех компонентов Material 3:

Материал 3

Материал 2,5 эквивалентный компонент (если не новый в M3)

androidx.wear.compose.material3.AlertDialog

androidx.wear.compose.material.dialog.Оповещение

androix.wear.compose.material3.Анимированная страница

Новый

androidx.wear.compose.material3.АнимированныйТекст

Новый

androidx.wear.compose material3.AppScaffold

android.wear.compose.material.Scaffoldandroidx.wear.compose.material3.ScreenScaffold )

androidx.wear.compose.material3.Кнопка

androidx.wear.compose.material.Чип

androidx.wear.compose.material3.ButtonGroup

Новый

androidx.wear.compose.material3.Карта

androidx.wear.compose.material.Карта

androidx.wear.compose.material3.CheckboxButton

androidx.wear.compose.material.ToggleChip с переключателем-флажком

androidx.wear.compose.material3.ChildButton

androidx.wear.compose.material.Chip (только когда фон не требуется)

androidx.wear.compose.material3.CircularProgressIndicator

androidx.wear.compose.material.CircularProgressIndicator

androidx.wear.compose.material3.CompactButton

androidx.wear.compose.material.CompactChip

androidx.wear.compose.material3.Подтверждение Диалог

androidx.wear.compose.material.dialog.Подтверждение

androidx.wear.compose.material3.curvedText

androidx.wear.compose.material.curvedText

androidx.wear.compose.material3.DatePicker

Новый

androidx.wear.compose.material3.Диалог

androidx.wear.compose.material.dialog.Диалог

androidx.wear.compose.material3.EdgeButton

Новый

androidx.wear.compose.material3.ВыцветаниеРасширяющаясяМетка

Новый

androidx.wear.compose.material3.FilledTonalButton

androidx.wear.compose.material.Chip , когда требуется тональный фон кнопки

androidx.wear.compose.material3.Горизонтальный индикатор страницы

androidx.wear.compose.material.Горизонтальный индикатор страницы

androidx.wear.compose.material3.HorizontalPagerScaffold

Новый

androidx.wear.compose.material3.Иконка

androidx.wear.compose.material.Иконка

androidx.wear.compose.material3.IconButton

androidx.wear.compose.material.Кнопка

androidx.wear.compose.material3.IconToggleButton

androidx.wear.compose.material.ToggleButton

androidx.wear.compose.material3.Индикатор уровня

Новый

androidx.wear.compose.material3.Линейный индикатор прогресса

Новый

androidx.wear.compose.material3.Заголовок списка

androidx.wear.compose.material.Заголовок списка

androidx.wear.compose.material3.ListSubHeader

Новый

androidx.wear.compose.material3.MaterialTheme

androidx.wear.compose.material.MaterialTheme

androidx.wear.compose.material3.ОткрытьНаТелефонеДиалог

Новый

androidx.wear.compose.material3.Picker

androidx.wear.compose.material.Picker

androidx.wear.compose.material3.PickerGroup

androidx.wear.compose.material.PickerGroup

androix.wear.compose.material3.RadioButton

androidx.wear.compose.material.ToggleChip с переключателем управления

androidx.wear.compose.material3.ScreenScaffold

android.wear.compose.material.Scaffoldandroidx.wear.compose material3.AppScaffold )

androidx.wear.compose.material3.Индикатор прокрутки

androidx.wear.compose.material.PositionIndicator

androidx.wear.compose.material3.scrollaway

androidx.wear.compose.material.scrollaway

androidx.wear.compose.material3.СегментированныйКруговойИндикаторПрогресса

Новый

androidx.wear.compose.material3.Slider

androidx.wear.compose.material.InlineSlider

androidx.wear.compose.material3.SplitRadioButton

androidx.wear.compose.material.SplitToggleChip

androidx.wear.compose.material3.SplitCheckboxButton

androidx.wear.compose.material.SplitToggleChip

androidx.wear.compose.material3.SplitSwitchButton

androidx.wear.compose.material.SplitToggleChip

androidx.wear.compose.material3.Степпер

androidx.wear.compose.material.Шаговый

androidx.wear.compose.material3.SwipeToDismissBox

androidx.wear.compose.material.SwipeToDismissBox

androidx.wear.compose.material3.Проведите пальцем, чтобы показать

androidx.wear.compose.material.SwipeToRevealCard и androidx.wear.compose.material.SwipeToRevealChip

androidx.wear.compose.material3.Кнопка переключения

androidx.wear.compose.material.ToggleChip с переключателем управления

androidx.wear.compose.material3.Текст

androidx.wear.compose.material.Текст

androidx.wear.compose.material3.TextButton

androidx.wear.compose.material.Кнопка

androidx.wear.compose.material3.TextToggleButton

androidx.wear.compose.material.ToggleButton

androidx.wear.compose.material3.TimeText

androidx.wear.compose.material.TimeText

androidx.wear.compose.material3.VerticalPagerScaffold

Новый

И, наконец, список некоторых важных компонентов из библиотеки Wear Compose Foundation версии 1.5.0-beta01:

Носите Compose Foundation 1.5.0-бета

androidx.wear.compose.foundation.hierarchicalFocusGroup

Используется для аннотирования компонуемых элементов в приложении, отслеживания активной части композиции и координации фокуса.

androidx.compose.foundation.pager.Горизонтальный пейджер

Горизонтально прокручиваемый пейджер, созданный на основе компонентов Compose Foundation с усовершенствованиями, специфичными для Wear, для повышения производительности и соответствия рекомендациям Wear OS.

androidx.compose.foundation.pager.ВертикальныйПейджер

Вертикально прокручиваемый пейджер, созданный на основе компонентов Compose Foundation с усовершенствованиями, специально разработанными для Wear, для повышения производительности и соответствия рекомендациям Wear OS.

androidx.wear.foundation.lazy.TransformingLazyColumn

Может использоваться вместо ScalingLazyColumn для добавления эффектов преобразования прокрутки к каждому элементу.

Кнопки

Кнопки в M3 отличаются от M2.5. Чип M2.5 был заменен на Button. Реализация Button предоставляет значения по умолчанию для Text maxLines и textAlign . Эти значения по умолчанию можно переопределить в элементе Text .

М2.5

import androidx.wear.compose.material.Chip

//M2.5 Buttons
Chip(...)
CompactChip(...)
Button(...)

М3

import androidx.wear.compose.material3.Button

//M3 Buttons
Button(...)
CompactButton(...)
IconButton(...)
TextButton(...)

M3 также включает новые варианты кнопок. Ознакомьтесь с ними в обзоре справки API Compose Material 3 .

M3 представляет новую кнопку: EdgeButton . EdgeButton доступен в 4 различных размерах: очень маленький, маленький, средний и большой. Реализация EdgeButton предоставляет значение по умолчанию для maxLines в зависимости от размера, который можно настроить.

Если вы используете TransformingLazyColumn и ScalingLazyColumn , передайте EdgeButton в ScreenScaffold , чтобы он трансформировался, изменяя свою форму при прокрутке. Посмотрите код ниже, чтобы проверить, как использовать EdgeButton с ScreenScaffold и TransformingLazyColumn .

import androidx.wear.compose.material3.EdgeButton
import androidx.wear.compose.material3.ScreenScaffold

ScreenScaffold(
   scrollState = state,
   contentPadding = contentPadding,
   edgeButton = {
      EdgeButton(...)
   }
){ contentPadding ->
   TransformingLazyColumn(state = state, contentPadding = contentPadding,){
   // additional code here
   }
}

Строительные леса

Scaffold в M3 отличается от M2.5. В M3 AppScaffold и новый компонуемый ScreenScaffold заменили Scaffold. AppScaffold и ScreenScaffold выкладывают структуру экрана и координируют переходы компонентов ScrollIndicator и TimeText .

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

Вы объявляете один AppScaffold для Activity и используете ScreenScaffold для каждого экрана.

М2.5

import androidx.wear.compose.material.Scaffold

Scaffold {...}

М3

import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.ScreenScaffold

AppScaffold {
   // Define the navigation hierarchy within the AppScaffold,
   // such as using SwipeDismissableNavHost.
   SwipeDismissableNavHost(...) {
      composable("home") {
         HomeScreen()
      }
      //other screens
   }
}
fun HomeScreen() {
    val scrollState = rememberScrollState()
    ScreenScaffold(scrollState = scrollState) {
    //rest of the screen code
    }
}

Если вы используете HorizontalPager с HorizontalPagerIndicator , вы можете перейти на HorizontalPagerScaffold . HorizontalPagerScaffold размещается внутри AppScaffold . AppScaffold и HorizontalPagerScaffold размещают структуру Pager и координируют переходы компонентов HorizontalPageIndicator и TimeText .

HorizontalPagerScaffold отображает HorizontalPageIndicator в центре экрана по умолчанию и координирует отображение/скрытие TimeText и HorizontalPageIndicator в зависимости от того, просматривается ли Pager , это определяется PagerState .

Также появился новый компонент AnimatedPage , который анимирует страницу в Pager с эффектом масштабирования и сетки в зависимости от ее положения.

import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.HorizontalPagerScaffold
import androidx.wear.compose.material3.ScreenScaffold
import androidx.wear.compose.foundation.pager.HorizontalPager
import androidx.wear.compose.foundation.pager.rememberPagerState

AppScaffold {
    val pagerState = rememberPagerState(pageCount = { 10 })

    HorizontalPagerScaffold(pagerState = pagerState) {
       HorizontalPager(
          state = pagerState,
        ) { page ->
            AnimatedPage(pageIndex = page, pagerState = pagerState) {
                ScreenScaffold {

   }
}

Наконец, M3 представляет VerticalPagerScaffold , который следует тому же шаблону, что и HorizontalPagerScaffold :

import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.HorizontalPagerScaffold
import androidx.wear.compose.material3.ScreenScaffold
import androidx.wear.compose.foundation.pager.VerticalPager
import androidx.wear.compose.foundation.pager.rememberPagerState

AppScaffold {
   val pagerState = rememberPagerState(pageCount = { 10 })

   VerticalPagerScaffold(pagerState = pagerState) {
      VerticalPager(
         state = pagerState
      ) { page ->
             AnimatedPage(pageIndex = page, pagerState = pagerState){
                ScreenScaffold {
        
   }
}

Заполнитель

Есть некоторые изменения API между M2.5 и M3. Placeholder.PlaceholderDefaults теперь предоставляет два модификатора:

  • Modifier.placeholder , который рисуется вместо содержимого, которое еще не загружено
  • Эффект мерцания заполнителя Modifier.placeholderShimmer , который обеспечивает эффект мерцания заполнителя, который выполняется в цикле анимации во время ожидания загрузки данных.

Дополнительные изменения в компоненте Placeholder см. ниже.

М2.5

М3

PlaceholderState.startPlaceholderAnimation

Был удален

PlaceholderState.placeholderProgression

Был удален

PlaceholderState.isShowContent

Переименован в !PlaceholderState.isVisible

PlaceholderState.isWipeOff

Был удален

PlaceholderDefaults.painterWithPlaceholderOverlayBackgroundBrush

был удален

PlaceholderDefaults.placeholderBackgroundBrush

Был удален

PlaceholderDefaults.placeholderChipColors

Был удален

SwipeDismissableNavHost

SwipeDismissableNavHost является частью wear.compose.navigation . Когда этот компонент используется с M3, M3 MaterialTheme обновляет LocalSwipeToDismissBackgroundScrimColor и LocalSwipeToDismissContentScrimColor .

TransformingLazyColumn

TransformingLazyColumn является частью wear.compose.lazy.foundation и добавляет поддержку масштабирования и анимации морфинга элементов списка во время прокрутки, улучшая пользовательский опыт.

Подобно ScalingLazyColumn , он предоставляет rememberTransformingLazyColumnState() для создания TransformingLazyColumnState , который запоминается между композициями.

Для добавления анимаций масштабирования и морфинга добавьте следующее к каждому элементу списка:

  • Modifier.transformedHeight , который позволяет вычислять преобразованную высоту элементов с помощью TransformationSpec , вы можете использовать rememberTransformationSpec() если вам не требуется дополнительная настройка.
  • SurfaceTransformation трансформация
import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.ScreenScaffold
import androidx.wear.compose.material3.SurfaceTransformation
import androidx.wear.compose.material3.lazy.rememberTransformationSpec
import androidx.wear.compose.material3.lazy.transformedHeight
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
import androidx.wear.compose.foundation.lazy.TransformingLazyColumn

val state = rememberTransformingLazyColumnState()
val transformationSpec = rememberTransformationSpec()
AppScaffold {
   ScreenScaffold(state) { contentPadding ->
      TransformingLazyColumn(state = state, contentPadding = contentPadding) {
         items(count = 50) {
            Button(
               onClick = {},
               modifier =
                        Modifier.fillMaxWidth().transformedHeight(this, transformationSpec),
                        transformation = SurfaceTransformation(transformationSpec),
                    ) {
                        Text("Item $it")
                    }
                }
            }
        }
    }

Полезные ссылки

Чтобы узнать больше о переходе с M2.5 на M3 в Compose, ознакомьтесь со следующими дополнительными ресурсами.

Образцы

Образцы Wear OS в ветке Material3 на GitHub

Лабораторная работа по созданию кода Compose для Wear OS

Справочник API и исходный код

Дизайн