انتقال از Material 2.5 به Material 3 در Compose برای Wear OS

Material 3 Expressive تحول بعدی «طراحی مواد» است. این نسخه شامل ویژگی‌های به‌روزشده زمینه‌سازی، مؤلفه‌ها، و شخصی‌سازی مثل رنگ پویا است.

این راهنما بر انتقال از کتابخانه Jetpack Wear Compose Material 2.5 (androidx.wear.compose) به کتابخانه Jetpack Wear Compose Material 3 (androidx.wear.compose.material3) برای برنامه‌ها تمرکز دارد.

رویکردها

برای انتقال کد برنامه‌تان از M2.5 به M3، همان رویکرد شرح‌داده‌شده در راهنمای تلفن انتقال Compose Material را دنبال کنید، به‌ویژه:

وابستگی‌ها

M3 بسته و نسخه جداگانه‌ای نسبت‌به M2.5 دارد:

M2.5

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

M3

implementation("androidx.wear.compose:compose-material3:1.8.0-alpha03")

جدیدترین نسخه‌های M3 را در صفحه نسخه‌های Wear Compose ببینید.

نسخه 1.8.0-alpha03 کتابخانه Wear Compose Foundation چند مؤلفه جدید معرفی کرده است که برای کار با مؤلفه‌های Material 3 طراحی شده‌اند. به‌طور مشابه، SwipeDismissableNavHost از کتابخانه Wear Compose Navigation هنگام اجرا در Wear OS 6 (سطح میانای برنامه‌سازی کاربردی ۳۶) یا بالاتر، پویانمایی به‌روزشده‌ای دارد. هنگام به‌روزرسانی به نسخه Wear Compose Material 3، پیشنهاد می‌کنیم کتابخانه‌های Wear Compose Foundation و Navigation را نیز به‌روز کنید:

implementation("androidx.wear.compose:compose-foundation:1.8.0-alpha03")
implementation("androidx.wear.compose:compose-navigation:1.8.0-alpha03")

زمینه

در هر دو M2.5 و M3، نام تم قابل‌ساخت MaterialTheme است، اما بسته‌ها و پارامترهای واردشده متفاوت هستند. در M3، پارامتر Colors به ColorScheme تغییر نام داده است و MotionScheme برای پیاده‌سازی انتقال‌ها معرفی شده است.

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 = ColorScheme(),
        typography = Typography(),
        shapes = Shapes(),
        motionScheme = MotionScheme.standard(),
        content = { /*content here*/ }
    )

رنگ

سیستم رنگ در M3 تفاوت قابل‌توجهی با M2.5 دارد. تعداد پارامترهای رنگ افزایش یافته است، نام‌های متفاوتی دارند، و به‌طور متفاوتی به مؤلفه‌های M3 نگاشت می‌شوند. در Compose، این مورد برای کلاس M2.5 Colors، کلاس M3 ColorScheme، و توابع مرتبط اعمال می‌شود:

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
    )

جدول زیر تفاوت‌های کلیدی بین M2.5 و M3 را شرح می‌دهد:

M2.5 M3
Colors نام به ColorScheme تغییر کرد
‫۱۳ رنگ ‫۲۹ رنگ
موجود نیست مضمون‌سازی رنگ پویای جدید
موجود نیست رنگ‌های سوم جدید برای بیان بهتر احساسات

زمینه رنگ پویا

یکی از ویژگی‌های جدید در M3 زمینه رنگ پویا است. اگر کاربران رنگ‌های صفحه ساعت را تغییر دهند، رنگ‌های میانای کاربر نیز برای مطابقت تغییر می‌کند.

از تابع dynamicColorScheme برای پیاده‌سازی آرایش رنگ‌های پویا استفاده کنید و defaultColorScheme را به‌عنوان جایگزین ارائه دهید تا درصورت دردسترس نبودن آرایش رنگ‌های پویا استفاده شود.

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

internal val myBrandColors: ColorScheme = ColorScheme( /* Specify colors here */)

نویسه‌نگاری

سیستم حروف‌چینی در M3 با M2.5 متفاوت است و شامل ویژگی‌های زیر است:

  • نه سبک نوشتار جدید
  • قلم‌های Flex که امکان سفارشی‌سازی مقیاس‌های نوع را برای وزن‌ها، پهناها، و گردی‌های مختلف فراهم می‌کند
  • ‫AnimatedText، که از قلم‌های flex استفاده می‌کند

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
)

قلم‌های Flex

«قلم‌های Flex» به طراحان اجازه می‌دهد تا پهنا و سیاهی قلم را برای اندازه‌های خاص مشخص کنند.

سبک‌های نوشتارمتن

TextStyles زیر در M3 دردسترس است. این‌ها به‌طور پیش‌فرض توسط مؤلفه‌های مختلف M3 به‌کار گرفته می‌شوند.

نویسه‌نگاری TextStyle
نمایش displayLarge, displayMedium, displaySmall
عنوان titleLarge, titleMedium, titleSmall
برچسب labelLarge, labelMedium, labelSmall
بدن bodyLarge, bodyMedium, bodySmall, bodyExtraSmall
عدد numeralExtraLarge, numeralLarge, numeralMedium, numeralSmall, numeralExtraSmall
کمان arcLarge, arcMedium, arcSmall

شکل‌ها

سیستم شکل در M3 با M2.5 متفاوت است. تعداد پارامترهای شکل افزایش یافته است، نام آن‌ها متفاوت است، و به‌طور متفاوتی به مؤلفه‌های M3 نگاشت می‌شوند. اندازه‌های شکل زیر دردسترس است:

  • بسیار کوچک
  • کوچک
  • متوسط
  • بزرگ
  • بسیار بزرگ

در Compose، این مورد برای کلاس M2.5 Shapes و کلاس M3 Shapes اعمال می‌شود:

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
)

از نگاشت پارامتر «اشکال» از انتقال از Material 2 به Material 3 در Compose به‌عنوان نقطه شروع استفاده کنید.

تغییر تدریجی شکل

M3 «دگردیسی شکل» را معرفی می‌کند: اکنون شکل‌ها در پاسخ به تعاملات دگردیسی می‌کنند.

رفتار «دگرگونی شکل» به‌عنوان یک نوع در تعدادی از دکمه‌های گرد دردسترس است، فهرست دکمه‌هایی را که از «دگرگونی شکل» پشتیبانی می‌کنند در زیر ببینید:

دکمه‌ها تابع دگردیسی شکل
IconButton IconButtonDefaults.animatedShapes دکمه نماد را هنگام فشار دادن پویانمایی می‌کند
IconToggleButton IconToggleButtonDefaults.animatedShapes دکمه مبدل نماد را هنگام فشار دادن پویانمایی می‌کند و
IconToggleButtonDefaults.variantAnimatedShapes دکمه مبدل نماد را هنگام فشار دادن و علامت زدن/ لغو علامت زدن پویانمایی می‌کند
TextButton TextButtonDefaults.animatedShapes دکمه نوشتار را هنگام فشار دادن پویانمایی می‌کند
TextToggleButton TextToggleButtonDefaults.animatedShapes دکمه جابه‌جایی نوشتار را هنگام فشار دادن پویانمایی می‌کند و TextToggleButtonDefaults.variantAnimatedShapes دکمه جابه‌جایی نوشتار را هنگام فشار دادن و علامت زدن/ لغو علامت زدن پویانمایی می‌کند

مؤلفه‌ها و چیدمان

اکثر مؤلفه‌ها و چیدمان‌های M2.5 در M3 دردسترس هستند. بااین‌حال، برخی‌از مؤلفه‌ها و چیدمان‌های M3 در M2.5 وجود نداشتند. علاوه‌براین، برخی‌از مؤلفه‌های M3 تنوع بیشتری نسبت‌به معادل‌هایشان در M2.5 دارند.

درحالی‌که برخی‌از مؤلفه‌ها به ملاحظات خاصی نیاز دارند، نگاشت‌های تابع زیر به‌عنوان نقطه شروع توصیه می‌شوند:

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 یا 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 معادل M3 وجود ندارد، به androidx.wear.compose.material3.CheckboxButton یا androidx.wear.compose.material3.SplitCheckboxButton منتقل شوید
androidx.wear.compose.material.Chip 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 در Material 3 از آن استفاده نمی‌کنند
androidx.wear.compose.material.PositionIndicator androidx.wear.compose.material3.ScrollIndicator
androidx.wear.compose.material.RadioButton معادل M3 وجود ندارد، به androidx.wear.compose.material3.RadioButton یا 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
androidx.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.SwitchButton
androidx.wear.compose.material.Vignette برداشته شد چون در طراحی Material 3 Expressive برای Wear OS گنجانده نشده است

در اینجا فهرستی از مؤلفه‌های رایج Material 3 و معادل‌های Material 2.5 آن‌ها آورده شده است:

Material 3 مؤلفه معادل Material 2.5 (اگر در M3 جدید نباشد)
androidx.wear.compose.material3.AlertDialog androidx.wear.compose.material.dialog.Alert
androidx.wear.compose.material3.AnimatedPage جدید
androidx.wear.compose.material3.AnimatedText جدید
androidx.wear.compose.material3.AppScaffold androidx.wear.compose.material.Scaffold (با androidx.wear.compose.material3.ScreenScaffold )
androidx.wear.compose.material3.Button androidx.wear.compose.material.Chip
androidx.wear.compose.material3.ButtonGroup جدید
androidx.wear.compose.material3.Card androidx.wear.compose.material.Card
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.ConfirmationDialog androidx.wear.compose.material.dialog.Confirmation
androidx.wear.compose.material3.curvedText androidx.wear.compose.material.curvedText
androidx.wear.compose.material3.DatePicker جدید
androidx.wear.compose.material3.Dialog androidx.wear.compose.material.dialog.Dialog
androidx.wear.compose.material3.EdgeButton جدید
androidx.wear.compose.material3.FadingExpandingLabel جدید
androidx.wear.compose.material3.FilledTonalButton androidx.wear.compose.material.Chip وقتی پس‌زمینه دکمه رنگی لازم است
androidx.wear.compose.material3.HorizontalPageIndicator androidx.wear.compose.material.HorizontalPageIndicator
androidx.wear.compose.material3.HorizontalPagerScaffold جدید
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 جدید
androidx.wear.compose.material3.LinearProgressIndicator جدید
androidx.wear.compose.material3.ListHeader androidx.wear.compose.material.ListHeader
androidx.wear.compose.material3.ListSubHeader جدید
androidx.wear.compose.material3.MaterialTheme androidx.wear.compose.material.MaterialTheme
androidx.wear.compose.material3.OpenOnPhoneDialog جدید
androidx.wear.compose.material3.Picker androidx.wear.compose.material.Picker
androidx.wear.compose.material3.PickerGroup androidx.wear.compose.material.PickerGroup
androidx.wear.compose.material3.RadioButton androidx.wear.compose.material.ToggleChip با کنترل دکمه رادیویی
androidx.wear.compose.material3.ScreenScaffold androidx.wear.compose.material.Scaffold (با 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 جدید
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 و androidx.wear.compose.material.SwipeToRevealChip
androidx.wear.compose.material3.SwitchButton androidx.wear.compose.material.ToggleChip با کنترل کلید روشن/خاموش
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 جدید

و درنهایت فهرستی از برخی مؤلفه‌های مرتبط از کتابخانه Wear Compose Foundation:

Wear Compose Foundation 1.8.0-alpha03
androidx.wear.compose.foundation.hierarchicalFocusGroup برای حاشیه‌نویسی کردن ترکیب‌شدنی‌ها در برنامه، پیگیری بخش فعال ترکیب‌بندی، و هماهنگ کردن تمرکز استفاده می‌شود.
androidx.wear.compose.foundation.pager.HorizontalPager ورق‌زن پیمایشی افقی که بر مؤلفه‌های Compose Foundation با بهبودهای ویژه Wear ساخته شده است تا عملکرد و پیروی از دستورالعمل‌های Wear OS را بهبود بخشد.
androidx.wear.compose.foundation.pager.VerticalPager یک ورق‌زن با پیمایش عمودی که بر مؤلفه‌های Compose Foundation با بهبودهای ویژه Wear ساخته شده است تا عملکرد و پیروی از دستورالعمل‌های Wear OS را بهبود بخشد.
androidx.wear.compose.foundation.lazy.TransformingLazyColumn می‌تواند به‌جای ScalingLazyColumn برای افزودن جلوه‌های تبدیل پیمایش به هر مورد استفاده شود.

دکمه‌ها

دکمه‌ها در M3 با M2.5 متفاوت است. تراشه M2.5 با دکمه جایگزین شده است. پیاده‌سازی Button مقادیر پیش‌فرض را برای Text maxLines و textAlign ارائه می‌دهد. این مقادیر پیش‌فرض را می‌توان در عنصر Text لغو کرد.

M2.5

import androidx.wear.compose.material.Chip

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

M3

//M3 Buttons
Button(onClick = { }){}
CompactButton(onClick = { }){}
IconButton(onClick = { }){}
TextButton(onClick = { }){}

M3 همچنین شامل انواع جدید دکمه است. آن‌ها را در نمای کلی مرجع Compose Material 3 API بررسی کنید.

M3 دکمه جدیدی را معرفی می‌کند: EdgeButton. EdgeButton در ۴ اندازه مختلف دردسترس است: خیلی کوچک، کوچک، متوسط، و بزرگ. EdgeButton پیاده‌سازی مقدار پیش‌فرضی برای maxLines بسته به اندازه ارائه می‌دهد که می‌تواند سفارشی‌سازی شود.

اگر از TransformingLazyColumn یا ScalingLazyColumn استفاده می‌کنید، EdgeButton را به ScreenScaffold منتقل کنید تا دگرگون شود و شکل آن با پیمایش تغییر کند، به‌جای اینکه EdgeButton را به‌عنوان آخرین مورد فهرست اضافه کنید. برای بررسی نحوه استفاده از EdgeButton با ScreenScaffold و TransformingLazyColumn، کد زیر را ببینید.

val state = rememberTransformingLazyColumnState()
ScreenScaffold(
    scrollState = state,
    edgeButton = {
        EdgeButton(
            onClick = { },
            modifier = Modifier.scrollable(
                state,
                orientation = Orientation.Vertical,
                reverseDirection = true,
                // Apply overscroll to the EdgeButton for proper scrolling behavior.
                overscrollEffect = rememberOverscrollEffect(),
            ),
        ) {
            Text(stringResource(R.string.show))
        }
    },
) { 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 برای «فعالیت» اعلام می‌کنید و برای هر «صفحه» از یک ScreenScaffold استفاده می‌کنید. AppScaffold یک مؤلفه پیش‌فرض TimeText به صفحه‌ها اضافه می‌کند. اگر می‌خواهید آن را سفارشی‌سازی کنید، می‌توانید بااستفاده از پارامتر timeText آن را لغو کنید.

M2.5

import androidx.wear.compose.material.Scaffold

Scaffold {...}

M3

    AppScaffold {
        val navController = rememberSwipeDismissableNavController()
        SwipeDismissableNavHost(
            navController = navController,
            startDestination = "message_list"
        ) {
            composable("message_list") {
                MessageList(onMessageClick = { id ->
                    navController.navigate("message_detail/$id")
                })
            }
            composable("message_detail/{id}") {
                MessageDetail(id = it.arguments?.getString("id")!!)
            }
        }
    }
}

// Implementation of one of the screens in the navigation
@Composable
fun MessageDetail(id: String) {
    // .. Screen level content goes here
    val scrollState = rememberTransformingLazyColumnState()
    val transformationSpec = rememberTransformationSpec()

    ScreenScaffold(
        scrollState = scrollState,
    ) { contentPadding ->
        // Screen content goes here
        // ...

اگر از HorizontalPager با HorizontalPageIndicator استفاده می‌کنید، می‌توانید به HorizontalPagerScaffold مهاجرت کنید. HorizontalPagerScaffold در AppScaffold قرار داده شده است. AppScaffold و HorizontalPagerScaffold ساختار «ورق‌زن» را طرح‌بندی می‌کنند و انتقال‌های مؤلفه‌های HorizontalPageIndicator و TimeText را هماهنگ می‌کنند.

HorizontalPagerScaffold به‌طور پیش‌فرض HorizontalPageIndicator را در مرکز-انتهای صفحه نمایش می‌دهد و نمایش و پنهان کردن TimeText و HorizontalPageIndicator را براساس اینکه Pager درحال ورق زدن است یا نه هماهنگ می‌کند، این موضوع توسط PagerState تعیین می‌شود.

همچنین یک مؤلفه جدید AnimatedPage وجود دارد که صفحه‌ای را در یک Pager با جلوه مقیاس‌بندی و پرده براساس موقعیت آن پویانمایی می‌کند.

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

    HorizontalPagerScaffold(pagerState = pagerState) {
        HorizontalPager(
            state = pagerState,
            flingBehavior =
                PagerScaffoldDefaults.snapWithSpringFlingBehavior(
                    state = pagerState
                ),
        ) { page ->
            AnimatedPage(pageIndex = page, pagerState = pagerState) {
                val columnState = rememberTransformingLazyColumnState()
                val transformationSpec = rememberTransformationSpec()

                ScreenScaffold(
                    scrollState = columnState,
                ) { contentPadding ->
                    TransformingLazyColumn(
                        state = columnState,
                        contentPadding = contentPadding,
                    ) {
                        item {
                            ListHeader(
                                modifier = Modifier
                                    .fillMaxWidth()
                                    .transformedHeight(this, transformationSpec)
                                    .minimumVerticalContentPadding(
                                        ListHeaderDefaults.minimumTopListContentPadding
                                    ),
                                transformation = SurfaceTransformation(transformationSpec),
                            ) {
                                Text(text = "Pager sample")
                            }
                        }
                        item {
                            Card(
                                modifier = Modifier
                                    .fillMaxWidth()
                                    .transformedHeight(this, transformationSpec)
                                    .minimumVerticalContentPadding(
                                        CardDefaults.minimumVerticalListContentPadding
                                    ),
                                transformation = SurfaceTransformation(transformationSpec),
                            ) {
                                if (page == 0) {
                                    Text(text = "Page #$page. Swipe right")
                                } else {
                                    Text(text = "Page #$page. Swipe left and right")
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

درنهایت، M3 یک VerticalPagerScaffold معرفی می‌کند که از همان الگوی HorizontalPagerScaffold پیروی می‌کند:

@Composable
fun VerticalPagerScaffoldSample() {
    AppScaffold {
        val pagerState = rememberPagerState(pageCount = { 10 })

        VerticalPagerScaffold(pagerState = pagerState) {
            VerticalPager(
                state = pagerState,
                flingBehavior =
                    PagerScaffoldDefaults.snapWithSpringFlingBehavior(
                        state = pagerState
                    ),
            ) { page ->
                AnimatedPage(pageIndex = page, pagerState = pagerState) {
                    ScreenScaffold {
                        Column(
                            modifier = Modifier.fillMaxSize(),
                            horizontalAlignment = Alignment.CenterHorizontally,
                            verticalArrangement = Arrangement.Center,
                        ) {
                            Text(text = "Page #$page")
                            Spacer(modifier = Modifier.height(8.dp))
                            Text(text = "Swipe up and down")
                        }
                    }
                }
            }
        }
    }
}

Placeholder

تغییراتی در میانای برنامه‌سازی کاربردی بین M2.5 و M3 وجود دارد. M3 دو اصلاح‌کننده جای‌بان ارائه می‌دهد:

  • Modifier.placeholder، که به‌جای محتوایی که هنوز بار نشده است ترسیم می‌شود
  • جلوه درخشان جای‌بان Modifier.placeholderShimmer که جلوه درخشان جای‌بانی را ارائه می‌دهد که درحین انتظار برای بار شدن داده‌ها، در حلقه پویانمایی اجرا می‌شود.

برای تغییرات بیشتر در مؤلفه Placeholder، جدول زیر را ببینید.

M2.5 M3
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 بخشی از androidx.wear.compose.foundation.lazy است و پشتیبانی از پویانمایی‌های مقیاس‌بندی و دگردیسی را به موارد فهرست درحین پیمایش اضافه می‌کند، و تجربه کاربری را بهبود می‌بخشد. اکیداً توصیه می‌شود که برنامه‌ها از ScalingLazyColumn به TransformingLazyColumn منتقل شوند.

مشابه ScalingLazyColumn، rememberTransformingLazyColumnState() را برای ایجاد TransformingLazyColumnState ارائه می‌دهد که در ترکیب‌بندی‌ها به‌خاطر سپرده می‌شود.

برای افزودن پویانمایی‌های مقیاس‌بندی و دگردیسی، موارد زیر را به هر مورد فهرست اضافه کنید:

  • Modifier.transformedHeight، که به شما امکان می‌دهد ارتفاع تبدیل‌شده موارد را بااستفاده از TransformationSpec محاسبه کنید، می‌توانید از rememberTransformationSpec() استفاده کنید، مگراینکه به سفارشی‌سازی بیشتری نیاز داشته باشید.
  • یک SurfaceTransformation

برای تأیید اینکه لایه داخلی در بالا و پایین فهرست صحیح است، از اصلاح‌کننده minimumVerticalContentPadding استفاده کنید.

val columnState = rememberTransformingLazyColumnState()
val transformationSpec = rememberTransformationSpec()
ScreenScaffold(
    scrollState = columnState
) { contentPadding ->
    TransformingLazyColumn(
        state = columnState,
        contentPadding = contentPadding
    ) {
        item {
            ListHeader(
                modifier = Modifier
                    .fillMaxWidth()
                    .transformedHeight(this, transformationSpec)
                    .minimumVerticalContentPadding(ListHeaderDefaults.minimumTopListContentPadding),
                transformation = SurfaceTransformation(transformationSpec)
            ) {
                Text(text = "Header")
            }
        }
        // ... other items
        item {
            Button(
                modifier = Modifier
                    .fillMaxWidth()
                    .transformedHeight(this, transformationSpec)
                    .minimumVerticalContentPadding(ButtonDefaults.minimumVerticalListContentPadding),
                transformation = SurfaceTransformation(transformationSpec),
                onClick = { /* ... */ },
                icon = {
                    Icon(
                        imageVector = Icons.Default.Build,
                        contentDescription = "build",
                    )
                },
            ) {
                Text(
                    text = "Build",
                    maxLines = 1,
                    overflow = TextOverflow.Ellipsis,
                )
            }
        }
    }
}

برای کسب اطلاعات بیشتر درباره انتقال از M2.5 به M3 در Compose، به منابع تکمیلی زیر مراجعه کنید.

نمونه‌ها

مرجع میانای برنامه‌سازی کاربردی و کد منبع

طراحی