Compose for Wear OS-এ Material 2.5 থেকে Material 3-তে মাইগ্রেট করা

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-এর থেকে আলাদা:

M2.5

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

M3

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

Wear Compose রিলিজ পৃষ্ঠা থেকে লেটেস্ট M3 ভার্সন দেখুন।

Wear Compose Foundation লাইব্রেরির 1.7.0 ভার্সনে কিছু নতুন কম্পোনেন্ট যোগ করা হয়েছে যেগুলি Material 3 কম্পোনেন্টের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। একইভাবে, Wear OS 6 (API লেভেল 36) বা তার পরের যেকোনও ভার্সনে রান করলে, Wear Compose Navigation লাইব্রেরির SwipeDismissableNavHost-এ আপডেট করা অ্যানিমেশন থাকে। Wear Compose Material 3 ভার্সনে আপডেট করার সময়, আমরা Wear Compose Foundation এবং নেভিগেশন লাইব্রেরিও আপডেট করার সাজেশন দিই:

implementation("androidx.wear.compose:compose-foundation:1.7.0")
implementation("androidx.wear.compose:compose-navigation:1.7.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
)

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 করা হয়েছে
১৩টি রঙ ২৯টি রঙ
N/A নতুন ডায়নামিক কালার থিমিং
N/A আরও এক্সপ্রেশনের জন্য নতুন টারশিয়ারি কালার

ডায়নামিক কালার থিমিং

M3-তে নতুন ফিচার হল ডায়নামিক কালার থিমিং। ব্যবহারকারীরা ওয়াচফেসের রঙ পরিবর্তন করলে, UI-এর রঙও ম্যাচ করার জন্য পরিবর্তিত হয়।

ডায়নামিক কালার স্কিম প্রয়োগ করতে 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, যা ফ্লেক্স ফন্ট ব্যবহার করে

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 Fonts, ডিজাইনারদের নির্দিষ্ট সাইজের জন্য টাইপ উইডথ ও ওয়েট নির্দিষ্ট করতে দেয়।

টেক্সট স্টাইল

M3-তে নিম্নলিখিত TextStyle উপলভ্য। এগুলি বিভিন্ন 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
)

শুরু করার জন্য Compose-এ Material 2 থেকে Material 3-তে মাইগ্রেট করুন থেকে Shapes প্যারামিটার ম্যাপিং ব্যবহার করুন।

শেপ মর্ফিং

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() Material 3-এ Text বা Icon ব্যবহার না করায় সরিয়ে দেওয়া হয়েছে
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 Wear OS-এর জন্য Material 3 Expressive ডিজাইনে অন্তর্ভুক্ত না থাকায় সরানো হয়েছে

এখানে সাধারণ 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.7.0
androidx.wear.compose.foundation.hierarchicalFocusGroup কোনও অ্যাপ্লিকেশনে কম্পোজ করার উপযুক্ত আইটেমকে অ্যানোটেট করতে, কম্পোজিশনের অ্যাক্টিভ অংশ ট্র্যাক করতে এবং ফোকাস কোঅর্ডিনেট করতে ব্যবহার করা হয়।
androidx.wear.compose.foundation.pager.HorizontalPager Wear OS নির্দেশিকা মেনে চলা এবং পারফর্ম্যান্স উন্নত করার জন্য Wear-নির্দিষ্ট এনহ্যান্সমেন্ট সহ Compose Foundation কম্পোনেন্টের উপর ভিত্তি করে তৈরি একটি অনুভূমিকভাবে স্ক্রল করা পেজার।
androidx.wear.compose.foundation.pager.VerticalPager Wear OS নির্দেশিকা মেনে চলা এবং পারফর্ম্যান্স উন্নত করার জন্য Wear-নির্দিষ্ট উন্নত ফিচার সহ Compose Foundation কম্পোনেন্টের উপর ভিত্তি করে তৈরি একটি উল্লম্বভাবে স্ক্রল করা পেজার।
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-কে চূড়ান্ত তালিকা আইটেম হিসেবে যোগ করার পরিবর্তে, এটি মরফ হয়। ScreenScaffold ও TransformingLazyColumn-এর সাথে EdgeButton কীভাবে ব্যবহার করতে হয় তা চেক করতে নিচের কোডটি দেখুন।

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

স্ক্যাফোল্ড

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

আপনি HorizontalPageIndicator-এর সাথে HorizontalPager ব্যবহার করলে, আপনি HorizontalPagerScaffold-এ মাইগ্রেট করতে পারবেন। HorizontalPagerScaffold-কে AppScaffold-এর মধ্যে রাখা হয়েছে। AppScaffold এবং HorizontalPagerScaffold পেজারের স্ট্রাকচার লে আউট করে এবং HorizontalPageIndicator ও TimeText কম্পোনেন্টের ট্রানজিশন কো অর্ডিনেট করে।

HorizontalPagerScaffold ডিফল্ট হিসেবে স্ক্রিনের মাঝখানে-শেষের দিকে HorizontalPageIndicator দেখায় এবং Pager পেজ করা হচ্ছে কিনা সেই অনুযায়ী TimeText ও HorizontalPageIndicator দেখানোর ও লুকানোর কোঅর্ডিনেট করে, এটি 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")
                        }
                    }
                }
            }
        }
    }
}

প্লেসহোল্ডার

M2.5 ও M3-এর মধ্যে কিছু API পরিবর্তন আছে। 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,
                )
            }
        }
    }
}

Compose-এ M2.5 থেকে M3-তে মাইগ্রেট করা সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।

নমুনা

API রেফারেন্স ও সোর্স কোড

ডিজাইন