در Compose for Wear OS از Material 2.5 به Material 3 مهاجرت کنید

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

این راهنما بر مهاجرت از کتابخانه جت‌پک Wear Compose Material 2.5 (androidx.wear.compose) به کتابخانه جت‌پک 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")

ام۳

implementation("androidx.wear.compose:compose-material3:1.6.0")

آخرین نسخه‌های M3 را در صفحه انتشار Wear Compose Material 3 مشاهده کنید.

کتابخانه Wear Compose Foundation نسخه ۱.۶.۰ برخی از اجزای جدید را معرفی کرد که برای کار با اجزای 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.6.0")
implementation("androidx.wear.compose:compose-navigation:1.6.0")

تم

در هر دو 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
)

ام۳

import androidx.wear.compose.material3.MaterialTheme
// ...
    MaterialTheme(
        colorScheme = ColorScheme(),
        typography = Typography(),
        shapes = Shapes(),
        motionScheme = MotionScheme.standard(),
        content = { /*content here*/ }
    )

رنگ

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

M2.5

import androidx.wear.compose.material.Colors

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

ام۳

import androidx.wear.compose.material3.ColorScheme
// ...
    val appColorScheme: ColorScheme = ColorScheme(
        // M3 ColorScheme parameters
    )

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

M2.5 ام۳
Color به 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 متفاوت است و شامل ویژگی‌های زیر می‌شود:

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

M2.5

import androidx.wear.compose.material.Typography

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

ام۳

import androidx.wear.compose.material3.Typography

val Typography = Typography(
    // M3 TextStyle parameters
)

فونت‌های فلکس

فونت‌های فلکس به طراحان این امکان را می‌دهند که عرض و ضخامت فونت را برای اندازه‌های خاص مشخص کنند.

سبک‌های متن

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

تایپوگرافی سبک متن
نمایش نمایشگربزرگ، نمایشگرمتوسط، نمایشگرکوچک
عنوان عنوانبزرگ، عنوانمتوسط، عنوانکوچک
برچسب برچسببزرگ، برچسبمتوسط، برچسبکوچک
بدن bodyLarge، bodyMedium، bodySmall، bodyExtraSmall
عدد عددیخیلی بزرگ، عددیبزرگ، عددیمتوسط، عددیکوچک، عددیخیلی کوچک
قوس قوس بزرگ، قوس متوسط، قوس کوچک

شکل

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

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

در Compose، این موضوع در مورد کلاس‌های M2 Shapes و M3 Shapes صدق می‌کند:

M2.5

import androidx.wear.compose.material.Shapes

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

ام۳

import androidx.wear.compose.material3.Shapes

val Shapes = Shapes(
    // M3 Shapes parameters
)

از نگاشت پارامترهای Shapes از Migrate from Material 2 to Material 3 در Compose به عنوان نقطه شروع استفاده کنید.

تغییر شکل

M3 قابلیت Shape Morphing را معرفی می‌کند: شکل‌ها اکنون در پاسخ به تعاملات تغییر شکل می‌دهند.

رفتار Shape Morphing به عنوان یک تغییر در تعدادی از دکمه‌های گرد موجود است، لیست دکمه‌هایی که از 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 تنوع بیشتری دارند.

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

ماده ۲.۵ ماده ۳
اندروید.ایکس.وی.آر.یو.پی.اس.دی.ال.او.اس.آی.دی.ایکس.آی.آر.دی androidx.wear.compose.material3.AlertDialog
دکمه.مواد.اندروید.ایکس.وی.آر.یو.ایکس.وی ...یو.ایکس. androidx.wear.compose.material3.IconButton یا androidx.wear.compose.material3.TextButton
اندروید.ایکس.وی.آر.یو.تی.آر.تی.آر.تی اندروید، لباس، ترکیب، متریال، کارت
androidx.wear.compose.material.TitleCard androidx.wear.compose.material3.TitleCard
اندروید.پوشیدن.نوشتن.مواد.کارت برنامه androidx.wear.compose.material3.AppCard
کادر انتخاب متریال.compose.androidx.wear معادل M3 وجود ندارد، به androidx.wear.compose.material3.CheckboxButton یا androidx.wear.compose.material3.SplitCheckboxButton مهاجرت کنید
اندروید.ایکس.وی.آر.یو.تی.آر.آی ... androidx.wear.compose.material3.Button یا
androidx.wear.compose.material3.OutlinedButton یا
androidx.wear.compose.material3.FilledTonalButton یا
androidx.wear.compose.material3.ChildButton
اندروید.ایکس.وی.آر.یو.تی.آر ... androidx.wear.compose.material3.CompactButton
androidx.wear.compose.material.InlineSlider اسلایدر متریال اندروید ۳
androidx.wear.compose.material.LocalContentAlpha() به دلیل عدم استفاده توسط Text یا Icon در متریال ۳ حذف شده است
نشانگر موقعیت مواد در اندروید ایکس ورکس androidx.wear.compose.material3.ScrollIndicator
androidx.wear.compose.material.RadioButton معادل M3 وجود ندارد، به androidx.wear.compose.material3.RadioButton یا androidx.wear.compose.material3.SplitRadioButton مهاجرت کنید
اندروید، لباس، نوشتن، متریال، کشیدن و آشکار کردن کارت اندروید، لباس، ترکیب، متریال ۳. کشیدن برای آشکار شدن
اندروید، لباس، نوشتن، متریال، کشیدن و رها کردن، تراشه اندروید، لباس، ترکیب، متریال ۳. کشیدن برای آشکار شدن
اندروید.پوشش.کامپوزیت.متریال.داربست 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 مهاجرت کنید.
اندروید، لباس، ترکیب، متریال، سوئیچ معادل M3 وجود ندارد، به androidx.wear.compose.material3.SwitchButton یا androidx.wear.compose.material3.SplitSwitchButton مهاجرت کنید
دکمه‌ی تغییر وضعیت متریال برای نوشتن لباس اندروید دکمه‌ی androidx.wear.compose.material3.IconToggleButton یا دکمه‌ی androidx.wear.compose.material3.TextToggleButton
اندروید.ایکس.وی.آر.یو.تی.آر ... androidx.wear.compose.material3.CheckboxButton یا
androidx.wear.compose.material3.RadioButton یا
androidx.wear.compose.material3.SwitchButton
اندروید.ایکس.ویژن.ویژن.متریال.پوشیدن.کامپوزیت حذف شده است زیرا در طراحی رسا Material 3 برای Wear OS گنجانده نشده است

در اینجا لیست کاملی از تمام اجزای Material 3 آمده است:

ماده ۳ قطعه معادل ماده ۲.۵ (اگر در M3 جدید نباشد)
androidx.wear.compose.material3.AlertDialog اندروید.ایکس.وی.آر.یو.پی.اس.دی.ال.او.اس.آی.دی.ایکس.آی.آر.دی
androidx.wear.compose.material3.AnimatedPage جدید
androidx.wear.compose.material3.AnimatedText جدید
androidx.wear.compose.material3.AppScaffold android.wear.compose.material.Scaffold (به همراه androidx.wear.compose.material3.ScreenScaffold )
دکمه.اندروید.ایکس.وی.آر.پی.اس.۳. اندروید.ایکس.وی.آر.یو.تی.آر.آی ...
androidx.wear.compose.material3.ButtonGroup جدید
اندروید، لباس، ترکیب، متریال، کارت اندروید.ایکس.وی.آر.یو.تی.آر.تی.آر.تی
دکمه‌ی انتخاب متریال ۳ در اندروید با استفاده از Wear.Compose.Material3 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.material3.ConfirmationDialog تأییدیه گفتگوی متریال.اندروید.ایکس.وی‌ای ...
androidx.wear.compose.material3.curvedText اندروید.ایکس.وی.آر.یو.تی.اف.تی.متریال.منحنی
androidx.wear.compose.material3.DatePicker جدید
اندروید، لباس، ترکیب، متریال، دیالوگ اندروید.ایکس.وی.آر.یو.دی.ال.جی.پی.پی.سی.متریال.دیالوگ
دکمه لبه‌ای اندروید جدید
androidx.wear.compose.material3.FadingExpandingLabel جدید
دکمه‌ی تونالِ پر شده با متریال ۳ برای اندروید و لباس androidx.wear.compose.material.Chip وقتی پس‌زمینه دکمه با تُن رنگی مورد نیاز است
androidx.wear.compose.material3.HorizontalPageIndicator androidx.wear.compose.material.HorizontalPageIndicator
androidx.wear.compose.material3.HorizontalPagerScaffold جدید
آیکون متریال ۳ اندروید و لباس آیکون متریال.اندروید.ایکس.وی.آر.یو ...ال.ایکس.وی.آر.یو
دکمه آیکون اندروید، لباس، ترکیب، متریال ۳ دکمه.مواد.اندروید.ایکس.وی.آر.یو.ایکس.وی ...یو.ایکس.
دکمه‌ی تغییر آیکون اندروید، مخصوص لباس، متریال ۳ دکمه‌ی تغییر وضعیت متریال برای نوشتن لباس اندروید
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.OpenOnPhoneDialog جدید
انتخابگر متریال اندروید انتخابگر مواد. اندروید.ایکس.وی.آر.یو.ای
androidx.wear.compose.material3.PickerGroup گروه انتخابگر متریال اندروید
androidx.wear.compose.material3.RadioButton androidx.wear.compose.material.ToggleChip با یک دکمه رادیویی برای تغییر وضعیت کنترل
androidx.wear.compose.material3.ScreenScaffold android.wear.compose.material.Scaffold (به همراه androidx.wear.compose.material3.AppScaffold )
androidx.wear.compose.material3.ScrollIndicator نشانگر موقعیت مواد در اندروید ایکس ورکس
androidx.wear.compose.material3.scrollAway اندروید.ایکس.وی.آر.یو.تی.آر.تی.اسکرول.دور
androidx.wear.compose.material3.SegmentedCircularProgressIndicator جدید
اسلایدر متریال اندروید ۳ androidx.wear.compose.material.InlineSlider
androidx.wear.compose.material3.SplitRadioButton androidx.wear.compose.material.SplitToggleChip
دکمه‌ی انتخاب جداشونده در androidx.wear.compose.material3.SplitCheckbox androidx.wear.compose.material.SplitToggleChip
androidx.wear.compose.material3.SplitSwitchButton androidx.wear.compose.material.SplitToggleChip
اندروید، لباس، ترکیب، متریال، ۳. پله‌زن اندروید، لباس، ترکیب، متریال، پله‌زن
androidx.wear.compose.material3.جعبه‌ی کشیدن برای رد کردن androidx.wear.compose.material.SwipeToDismissBox
اندروید، لباس، ترکیب، متریال ۳. کشیدن برای آشکار شدن androidx.wear.compose.material.SwipeToRevealCard ‎ و ‎androidx.wear.compose.material.SwipeToRevealChip
androidx.wear.compose.material3.SwitchButton androidx.wear.compose.material.ToggleChip با یک کنترل ضامن سوئیچ
اندروید، لباس، ترکیب، متریال، متن متن.متن.مواد.ترکیب.پوشش.اندروید
androidx.wear.compose.material3.TextButton دکمه.مواد.اندروید.ایکس.وی.آر.یو.ایکس.وی ...یو.ایکس.
دکمه‌ی تغییر متن اندروید x.wear.compose.material3.TextToggleButton دکمه‌ی تغییر وضعیت متریال برای نوشتن لباس اندروید
androidx.wear.compose.material3.TimeText androidx.wear.compose.material.TimeText
androidx.wear.compose.material3.VerticalPagerScaffold جدید

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

کرم پودر کامپوز ۱.۶.۰ را بپوشید
androidx.wear.compose.foundation.hierarchicalFocusGroup برای حاشیه‌نویسی ترکیبات در یک برنامه، پیگیری بخش فعال ترکیب و هماهنگ‌سازی تمرکز استفاده می‌شود.
androidx.wear.compose.foundation.pager.HorizontalPager یک پیجر با قابلیت پیمایش افقی، ساخته شده بر اساس اجزای Compose Foundation با بهبودهای مخصوص Wear برای بهبود عملکرد و پایبندی به دستورالعمل‌های Wear OS.
اندروید.ایکس.وی.آر.پیجر.عمودی یک پیجر با قابلیت پیمایش عمودی، ساخته شده بر اساس اجزای Compose Foundation با بهبودهای مخصوص Wear برای بهبود عملکرد و پایبندی به دستورالعمل‌های Wear OS.
androidx.wear.compose.foundation.lazy.TransformingLazyColumn می‌تواند به جای ScalingLazyColumn برای افزودن جلوه‌های تبدیل اسکرول به هر آیتم استفاده شود.

دکمه‌ها

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

M2.5

import androidx.wear.compose.material.Chip

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

ام۳

//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,
    contentPadding =
        rememberResponsiveColumnPadding(
            first = ColumnItemType.ListHeader
        ),
    edgeButton = {
        EdgeButton(
            onClick = { }
        ) {
            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 برای Activity تعریف می‌کنید و برای هر Screen از یک ScreenScaffold استفاده می‌کنید. AppScaffold یک کامپوننت TimeText پیش‌فرض به صفحات اضافه می‌کند. اگر می‌خواهید آن را با استفاده از پارامتر timeText سفارشی کنید، می‌توانید آن را بازنویسی کنید.

M2.5

import androidx.wear.compose.material.Scaffold

Scaffold {...}

ام۳

    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 padding = rememberResponsiveColumnPadding(
        first = ColumnItemType.BodyText
    )

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

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

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

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

AppScaffold {
    val pagerState = rememberPagerState(pageCount = { 10 })
    val columnState = rememberTransformingLazyColumnState()
    val contentPadding = rememberResponsiveColumnPadding(
        first = ColumnItemType.ListHeader,
        last = ColumnItemType.BodyText,
    )
    HorizontalPagerScaffold(pagerState = pagerState) {
        HorizontalPager(
            state = pagerState,
        ) { page ->
            AnimatedPage(pageIndex = page, pagerState = pagerState) {
                ScreenScaffold(
                    scrollState = columnState,
                    contentPadding = contentPadding
                ) { contentPadding ->
                    TransformingLazyColumn(
                        state = columnState,
                        contentPadding = contentPadding
                    ) {
                        item {
                            ListHeader(
                                modifier = Modifier.fillMaxWidth()
                            ) {
                                Text(text = "Pager sample")
                            }
                        }
                        item {
                            if (page == 0) {
                                Text(text = "Page #$page. Swipe right")
                            }
                            else{
                                Text(text = "Page #$page. Swipe left and right")
                            }
                        }
                    }
                }

            }
        }
    }
}

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

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 به جدول زیر مراجعه کنید.

M2.5 ام۳
PlaceholderState.startPlaceholderAnimation حذف شده است
PlaceholderState.placeholderProgression حذف شده است
PlaceholderState.isShowContent به !PlaceholderState.isVisible تغییر نام داده است.
PlaceholderState.isWipeOff حذف شده است
PlaceholderDefaults.painterWithPlaceholderOverlayBackgroundBrush حذف شده است
PlaceholderDefaults.placeholderBackgroundBrush حذف شده است
PlaceholderDefaults.placeholderChipColors حذف شده است

میزبان ناوبری قابل حذف با کشیدن انگشت

SwipeDismissableNavHost بخشی از wear.compose.navigation است. وقتی این کامپوننت با M3 استفاده می‌شود، M3 MaterialTheme مقادیر LocalSwipeToDismissBackgroundScrimColor و LocalSwipeToDismissContentScrimColor را به‌روزرسانی می‌کند.

تبدیل ستون تنبل

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

نمونه‌ها

مرجع API و کد منبع

طراحی