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:
- Anda tidak boleh menggunakan M2.5 dan M3 dalam satu aplikasi jangka panjang
- Mengadopsi pendekatan bertahap
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 |
---|---|
|
telah diganti namanya menjadi |
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 |
---|---|
|
IconButtonDefaults.animatedShape() menganimasikan tombol ikon saat ditekan |
|
IconToggleButtonDefaults.animatedShape() menganimasikan tombol ikon saat ditekan dan IconToggleButtonDefaults.variantAnimatedShapes() menganimasikan tombol ikon saat ditekan dan mencentang/membatalkan centang |
|
TextButtonDefaults.animatedShape() menganimasikan tombol teks saat ditekan |
|
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:
Berikut adalah daftar lengkap semua komponen Material 3:
Material 3 |
Komponen setara Material 2.5 (jika bukan yang baru di M3) |
---|---|
Baru |
|
Baru |
|
android.wear.compose.material.Scaffold (dengan androidx.wear.compose.material3.ScreenScaffold ) |
|
Baru |
|
androidx.wear.compose.material.ToggleChip dengan kontrol tombol kotak centang |
|
androidx.wear.compose.material.Chip (hanya jika tidak ada latar belakang yang diperlukan) |
|
Baru |
|
Baru |
|
Baru |
|
androidx.wear.compose.material.Chip jika latar belakang tombol tonal diperlukan |
|
Baru |
|
Baru |
|
Baru |
|
Baru |
|
Baru |
|
androidx.wear.compose.material.ToggleChip dengan kontrol tombol pilihan |
|
android.wear.compose.material.Scaffold (dengan androidx.wear.compose material3.AppScaffold) |
|
androidx.wear.compose.material3.SegmentedCircularProgressIndicator |
Baru |
androidx.wear.compose.material.SwipeToRevealCard dan androidx.wear.compose.material.SwipeToRevealChip |
|
androidx.wear.compose.material.ToggleChip dengan kontrol tombol tombol |
|
Baru |
Terakhir, daftar beberapa komponen yang relevan dari library Wear Compose Foundation versi 1.5.0-beta01:
Wear Compose Foundation 1.5.0-beta |
|
---|---|
Digunakan untuk menganotasi composable dalam aplikasi, untuk melacak bagian aktif komposisi dan mengoordinasikan fokus. |
|
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. |
|
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. |
|
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:
Modifier.placeholder
, yang digambar, bukan konten yang belum dimuat- Efek shimmer placeholder
Modifier.placeholderShimmer
yang memberikan efek shimmer placeholder yang berjalan dalam loop animasi saat menunggu data dimuat.
Lihat di bawah untuk perubahan tambahan pada komponen Placeholder
.
M2.5 |
M3 |
---|---|
|
Telah dihapus |
|
Telah dihapus |
|
Telah diganti namanya menjadi |
|
Telah dihapus |
|
telah dihapus |
|
Telah dihapus |
|
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 menggunakanTransformationSpec
, Anda dapat menggunakanrememberTransformationSpec()
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