Bermigrasi dari Material 2.5 ke Material 3 di Compose untuk Wear OS

Material 3 Ekspresif adalah evolusi berikutnya dari Desain Material. Desain Material ini mencakup versi terbaru tema, komponen, dan fitur personalisasi seperti warna dinamis.

Panduan ini berfokus pada migrasi dari library Jetpack Wear Compose Material 2.5 (androidx.wear.compose) ke library Jetpack Wear Compose Material 3 (androidx.wear.compose.material3) untuk aplikasi.

Pendekatan

Untuk memigrasikan kode aplikasi dari M2.5 ke M3, ikuti pendekatan yang sama seperti yang dijelaskan dalam panduan ponsel migrasi Compose Material, khususnya:

Dependensi

M3 memiliki paket dan versi terpisah untuk M2.5:

M2.5

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

M3

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

Lihat versi M3 terbaru di halaman rilis Wear Compose Material 3.

Library Wear Compose Foundation versi 1.5.0-beta01 memperkenalkan beberapa komponen baru yang dirancang untuk berfungsi dengan komponen Material 3. Demikian pula, SwipeDismissableNavHost dari library Navigasi Wear Compose memiliki animasi yang diperbarui saat berjalan di Wear OS 6 (API level 36) atau yang lebih baru. Saat mengupdate ke versi Wear Compose Material 3, sebaiknya update juga library Wear Compose Foundation dan Navigation:

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

Tema

Pada M2.5 dan M3, composable tema diberi nama MaterialTheme, tetapi paket dan parameter impornya berbeda. Di M3, parameter Colors telah diganti namanya menjadi ColorScheme dan MotionScheme telah diperkenalkan untuk menerapkan transisi.

M2.5

import androidx.wear.compose.material.MaterialTheme

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

M3

import androidx.wear.compose.material3.MaterialTheme

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

Warna

Sistem warna di M3 sangat berbeda dengan M2.5. Jumlah parameter warna telah meningkat, memiliki nama berbeda, dan dipetakan secara berbeda ke komponen M3. Di Compose, ini berlaku untuk class Colors M2.5, class ColorScheme M3, dan fungsi terkait:

M2.5

import androidx.wear.compose.material.Colors

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

M3

import androidx.wear.compose.material3.ColorScheme

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

Tabel berikut menjelaskan perbedaan utama antara M2.5 dan M3:

M2.5

M3

Color

telah diganti namanya menjadi ColorScheme

13 Warna

28 Warna

T/A

tema warna dinamis baru

T/A

warna tersier baru untuk lebih banyak ekspresi

Tema Warna Dinamis

Fitur baru di M3 adalah tema warna dinamis. Jika pengguna mengubah warna tampilan jam, warna di UI akan berubah agar cocok.

Gunakan fungsi dynamicColorScheme untuk menerapkan skema warna dinamis dan memberikan defaultColorScheme sebagai pengganti jika skema warna dinamis tidak tersedia.

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

Tipografi

Sistem tipografi di M3 berbeda dengan M2 dan menyertakan fitur berikut:

  • Sembilan gaya teks baru
  • Font fleksibel, yang memungkinkan penyesuaian skala huruf untuk ketebalan, lebar, dan kebulatan yang berbeda
  • AnimatedText, yang menggunakan font fleksibel

M2.5

import androidx.wear.compose.material.Typography

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

M3

import androidx.wear.compose.material3.Typography

val Typography = Typography(
   // M3 TextStyle parameters
)

Font Flex

Font Flex memungkinkan desainer menentukan lebar dan ketebalan jenis untuk ukuran tertentu.

Gaya Teks

TextStyles berikut tersedia di M3. Ini digunakan secara default oleh berbagai komponen M3.

Tipografi

TextStyle

Tampilan

displayLarge, displayMedium, displaySmall

Judul

titleLarge, titleMedium, titleSmall

Label

labelLarge, labelMedium, labelSmall

Isi

bodyLarge, bodyMedium, bodySmall, bodyExtraSmall

Angka

numeralExtraLarge, numeralLarge, numeralMedium, numeralSmall, numeralExtraSmall

Busur

arcLarge, arcMedium, arcSmall

Bentuk

Sistem bentuk di M3 berbeda dengan M2. Jumlah parameter bentuk telah meningkat, diberi nama berbeda, dan dipetakan berbeda ke komponen M3. Ukuran bentuk berikut tersedia:

  • Ekstra kecil
  • Kecil
  • Sedang
  • Besar
  • Ekstra besar

Di Compose, ini berlaku untuk class Shapes M2 dan class Shapes M3:

M2.5

import androidx.wear.compose.material.Shapes

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

M3

import androidx.wear.compose.material3.Shapes

val Shapes = Shapes(
   // M3 Shapes parameters
)

Gunakan pemetaan parameter Bentuk dari Bermigrasi dari Material 2 ke Material 3 di Compose sebagai titik awal.

Pembentukan bentuk

M3 memperkenalkan Shape Morphing: bentuk kini berubah sebagai respons terhadap interaksi.

Perilaku Shape Morphing tersedia sebagai variasi pada sejumlah tombol bulat, lihat di bawah:

Tombol

Fungsi morphing bentuk

IconButton

IconButtonDefaults.animatedShape() menganimasikan tombol ikon saat ditekan

IconToggleButton

IconToggleButtonDefaults.animatedShape() menganimasikan tombol ikon saat ditekan dan

IconToggleButtonDefaults.variantAnimatedShapes() menganimasikan tombol ikon saat ditekan dan mencentang/membatalkan centang

TextButton

TextButtonDefaults.animatedShape() menganimasikan tombol teks saat ditekan

TextToggleButton

TextToggleButtonDefaults.animatedShapes() menganimasikan tombol teks saat ditekan dan TextToggleButtonDefaults.variantAnimatedShapes() menganimasikan tombol teks saat ditekan dan centang/hapus centang

Komponen dan Tata Letak

Sebagian besar komponen dan tata letak dari M2.5 tersedia di M3. Namun, beberapa komponen dan tata letak M3 tidak ada di M2.5. Selain itu, beberapa komponen M3 memiliki lebih banyak variasi dibandingkan dengan yang setara di M2.5.

Meskipun beberapa komponen memerlukan pertimbangan khusus, pemetaan fungsi berikut direkomendasikan sebagai titik awal:

Material 2.5

Material 3

androidx.wear.compose.material.dialog.Alert

androidx.wear.compose.material3.AlertDialog

androidx.wear.compose.material.Button

androidx.wear.compose.material3.IconButton atau androidx.wear.compose.material3.TextButton

androidx.wear.compose.material.Card

androidx.wear.compose.material3.Card

androidx.wear.compose.material.TitleCard

androidx.wear.compose.material3.TitleCard

androidx.wear.compose.material.AppCard

androidx.wear.compose.material3.AppCard

androidx.wear.compose.material.Checkbox

Tidak ada M3 yang setara, migrasikan ke androidx.wear.compose.material3.CheckboxButton atau androidx.wear.compose.material3.SplitCheckboxButton

androidx.wear.compose.material.Chip

androidx.wear.compose.material3.Button atau
androidx.wear.compose.material3.OutlinedButton atau
androidx.wear.compose.material3.FilledTonalButton atau
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

Telah dihapus karena tidak digunakan oleh Text atau Icon di Material 3

androidx.wear.compose.material.PositionIndicator

androidx.wear.compose.material3.ScrollIndicator

androidx.wear.compose.material.RadioButton

Tidak ada M3 yang setara, migrasikan ke androidx.wear.compose.material3.RadioButton atau androidx.wear.compose.material3.SplitRadioButton

androidx.wear.compose.material.SwipeToRevealCard

androidx.wear.compose.material3.SwipeToReveal

androidx.wear.compose.material.SwipeToRevealChip

androidx.wear.compose.material3.SwipeToReveal

android.wear.compose.material.Scaffold

androidx.wear.compose material3.AppScaffold dan androidx.wear.compose.material3.ScreenScaffold

androidx.wear.compose.material.SplitToggleChip

Tidak ada yang setara dengan M3, bermigrasilah ke androidx.wear.compose.material3.SplitCheckboxButton, androidx.wear.compose.material3.SplitSwitchButton, atau androidx.wear.compose.material3.SplitRadioButton

androidx.wear.compose.material.Switch

Tidak ada yang setara dengan M3, migrasikan ke androidx.wear.compose.material3.SwitchButton atau androidx.wear.compose.material3.SplitSwitchButton

androidx.wear.compose.material.ToggleButton

androidx.wear.compose.material3.IconToggleButton atau androidx.wear.compose.material3.TextToggleButton

androidx.wear.compose.material.ToggleChip

androidx.wear.compose.material3.CheckboxButton atau
androidx.wear.compose.material3.RadioButton atau
androidx.wear.compose.material3.SwitchButton

androidx.wear.compose.material.Vignette

Dihapus karena tidak disertakan dalam desain Ekspresif Material 3 untuk Wear OS

Berikut adalah daftar lengkap semua komponen Material 3:

Material 3

Komponen setara Material 2.5 (jika bukan yang baru di M3)

androidx.wear.compose.material3.AlertDialog

androidx.wear.compose.material.dialog.Alert

androix.wear.compose.material3.AnimatedPage

Baru

androidx.wear.compose.material3.AnimatedText

Baru

androidx.wear.compose material3.AppScaffold

android.wear.compose.material.Scaffold (dengan androidx.wear.compose.material3.ScreenScaffold )

androidx.wear.compose.material3.Button

androidx.wear.compose.material.Chip

androidx.wear.compose.material3.ButtonGroup

Baru

androidx.wear.compose.material3.Card

androidx.wear.compose.material.Card

androidx.wear.compose.material3.CheckboxButton

androidx.wear.compose.material.ToggleChip dengan kontrol tombol kotak centang

androidx.wear.compose.material3.ChildButton

androidx.wear.compose.material.Chip (hanya jika tidak ada latar belakang yang diperlukan)

androidx.wear.compose.material3.CircularProgressIndicator

androidx.wear.compose.material.CircularProgressIndicator

androidx.wear.compose.material3.CompactButton

androidx.wear.compose.material.CompactChip

androidx.wear.compose.material3.ConfirmationDialog

androidx.wear.compose.material.dialog.Confirmation

androidx.wear.compose.material3.curvedText

androidx.wear.compose.material.curvedText

androidx.wear.compose.material3.DatePicker

Baru

androidx.wear.compose.material3.Dialog

androidx.wear.compose.material.dialog.Dialog

androidx.wear.compose.material3.EdgeButton

Baru

androidx.wear.compose.material3.FadingExpandingLabel

Baru

androidx.wear.compose.material3.FilledTonalButton

androidx.wear.compose.material.Chip jika latar belakang tombol tonal diperlukan

androidx.wear.compose.material3.HorizontalPageIndicator

androidx.wear.compose.material.HorizontalPageIndicator

androidx.wear.compose.material3.HorizontalPagerScaffold

Baru

androidx.wear.compose.material3.Icon

androidx.wear.compose.material.Icon

androidx.wear.compose.material3.IconButton

androidx.wear.compose.material.Button

androidx.wear.compose.material3.IconToggleButton

androidx.wear.compose.material.ToggleButton

androidx.wear.compose.material3.LevelIndicator

Baru

androidx.wear.compose.material3.LinearProgressIndicator

Baru

androidx.wear.compose.material3.ListHeader

androidx.wear.compose.material.ListHeader

androidx.wear.compose.material3.ListSubHeader

Baru

androidx.wear.compose.material3.MaterialTheme

androidx.wear.compose.material.MaterialTheme

androidx.wear.compose.material3.OpenOnPhoneDialog

Baru

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 dengan kontrol tombol pilihan

androidx.wear.compose.material3.ScreenScaffold

android.wear.compose.material.Scaffold (dengan androidx.wear.compose material3.AppScaffold)

androidx.wear.compose.material3.ScrollIndicator

androidx.wear.compose.material.PositionIndicator

androidx.wear.compose.material3.scrollaway

androidx.wear.compose.material.scrollaway

androidx.wear.compose.material3.SegmentedCircularProgressIndicator

Baru

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.Stepper

androidx.wear.compose.material.Stepper

androidx.wear.compose.material3.SwipeToDismissBox

androidx.wear.compose.material.SwipeToDismissBox

androidx.wear.compose.material3.SwipeToReveal

androidx.wear.compose.material.SwipeToRevealCard dan androidx.wear.compose.material.SwipeToRevealChip

androidx.wear.compose.material3.SwitchButton

androidx.wear.compose.material.ToggleChip dengan kontrol tombol tombol

androidx.wear.compose.material3.Text

androidx.wear.compose.material.Text

androidx.wear.compose.material3.TextButton

androidx.wear.compose.material.Button

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

Baru

Terakhir, daftar beberapa komponen yang relevan dari library Wear Compose Foundation versi 1.5.0-beta01:

Wear Compose Foundation 1.5.0-beta

androidx.wear.compose.foundation.hierarchicalFocusGroup

Digunakan untuk menganotasi composable dalam aplikasi, untuk melacak bagian aktif komposisi dan mengoordinasikan fokus.

androidx.compose.foundation.pager.HorizontalPager

Pengatur halaman yang men-scroll secara horizontal, yang dibuat pada komponen Compose Foundation dengan peningkatan khusus Wear untuk meningkatkan performa dan kepatuhan terhadap panduan Wear OS.

androidx.compose.foundation.pager.VerticalPager

Pengatur halaman yang men-scroll secara vertikal, dibuat berdasarkan komponen Compose Foundation dengan peningkatan khusus Wear untuk meningkatkan performa dan kepatuhan terhadap panduan Wear OS.

androidx.wear.foundation.lazy.TransformingLazyColumn

Dapat digunakan sebagai pengganti ScalingLazyColumn untuk menambahkan efek transformasi scroll ke setiap item.

Tombol

Tombol di M3 berbeda dengan M2.5. Chip M2.5 telah diganti dengan Tombol. Implementasi Button memberikan nilai default untuk Text maxLines dan textAlign. Nilai default tersebut dapat diganti di elemen Text.

M2.5

import androidx.wear.compose.material.Chip

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

M3

import androidx.wear.compose.material3.Button

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

M3 juga menyertakan variasi tombol baru. Lihat di ringkasan Referensi API Compose Material 3.

M3 memperkenalkan tombol baru: EdgeButton. EdgeButton tersedia dalam 4 ukuran berbeda: ekstra kecil, kecil, sedang, dan besar. Implementasi EdgeButton memberikan nilai default untuk maxLines, bergantung pada ukuran yang dapat disesuaikan.

Jika Anda menggunakan TransformingLazyColumn dan ScalingLazyColumn, teruskan EdgeButton ke ScreenScaffold sehingga berubah bentuk, mengubah bentuknya dengan scroll. Lihat kode di bawah untuk memeriksa cara menggunakan EdgeButton dengan ScreenScaffold dan 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

Scaffold di M3 berbeda dengan M2.5. Di M3, AppScaffold dan composable ScreenScaffold baru telah menggantikan Scaffold. AppScaffold dan ScreenScaffold menata struktur layar dan mengoordinasikan transisi komponen ScrollIndicator dan TimeText.

AppScaffold memungkinkan elemen layar statis seperti TimeText tetap terlihat selama transisi dalam aplikasi seperti geser untuk menutup. ​​Ini menyediakan slot untuk konten aplikasi utama, yang biasanya akan disediakan oleh komponen navigasi seperti SwipeDismissableNavHost

Anda mendeklarasikan satu AppScaffold untuk Aktivitas dan menggunakan ScreenScaffold untuk setiap Layar.

M2.5

import androidx.wear.compose.material.Scaffold

Scaffold {...}

M3

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

Jika menggunakan HorizontalPager dengan HorizontalPagerIndicator, Anda dapat bermigrasi ke HorizontalPagerScaffold. HorizontalPagerScaffold ditempatkan dalam AppScaffold. AppScaffold dan HorizontalPagerScaffold menata struktur Pager dan mengoordinasikan transisi komponen HorizontalPageIndicator danvTimeText.

HorizontalPagerScaffold menampilkan HorizontalPageIndicator di ujung tengah layar secara default dan mengoordinasikan tampilan/penyembunyikan TimeText dan HorizontalPageIndicator sesuai dengan apakah Pager sedang di-paging, hal ini ditentukan oleh PagerState.

Ada juga komponen AnimatedPage baru, yang menganimasikan halaman dalam Pager dengan efek penskalaan dan scrim berdasarkan posisinya.

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 {

   }
}

Terakhir, M3 memperkenalkan VerticalPagerScaffold yang mengikuti pola yang sama dengan 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 {
        
   }
}

Placeholder

Ada beberapa perubahan API antara M2.5 dan M3. Placeholder.PlaceholderDefaults sekarang menyediakan dua pengubah:

Lihat di bawah untuk perubahan tambahan pada komponen Placeholder.

M2.5

M3

PlaceholderState.startPlaceholderAnimation

Telah dihapus

PlaceholderState.placeholderProgression

Telah dihapus

PlaceholderState.isShowContent

Telah diganti namanya menjadi !PlaceholderState.isVisible

PlaceholderState.isWipeOff

Telah dihapus

PlaceholderDefaults.painterWithPlaceholderOverlayBackgroundBrush

telah dihapus

PlaceholderDefaults.placeholderBackgroundBrush

Telah dihapus

PlaceholderDefaults.placeholderChipColors

Telah dihapus

SwipeDismissableNavHost

SwipeDismissableNavHost adalah bagian dari wear.compose.navigation. Saat komponen ini digunakan dengan M3, MaterialTheme M3 akan mengupdate LocalSwipeToDismissBackgroundScrimColor dan LocalSwipeToDismissContentScrimColor.

TransformingLazyColumn

TransformingLazyColumn adalah bagian dari wear.compose.lazy.foundation dan menambahkan dukungan untuk menskalakan dan mengubah animasi pada item daftar selama men-scroll, sehingga meningkatkan pengalaman pengguna.

Serupa dengan ScalingLazyColumn, rememberTransformingLazyColumnState() menyediakan rememberTransformingLazyColumnState() untuk membuat TransformingLazyColumnState yang diingat di seluruh komposisi.

Untuk menambahkan animasi penskalaan dan perubahan bentuk, tambahkan kode berikut ke setiap item daftar:

  • Modifier.transformedHeight, yang memungkinkan Anda menghitung tinggi item yang ditransformasikan menggunakan TransformationSpec, Anda dapat menggunakan rememberTransformationSpec() kecuali jika Anda memerlukan penyesuaian lebih lanjut.
  • 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")
                    }
                }
            }
        }
    }

Link penting

Untuk mempelajari migrasi dari M2.5 ke M3 di Compose lebih lanjut, lihat referensi tambahan berikut.

Contoh

Contoh Wear OS di cabang Material3 di GitHub

Compose untuk codelab Wear OS

Referensi API dan kode sumber

Desain