শেয়ার করা এলিমেন্ট, স্ক্রিনের মধ্যে ট্রানজিশন আরও মসৃণ ও আকর্ষণীয় করে তোলে। এটি করার জন্য ভিজ্যুয়াল কানেকশন তৈরি করা হয় যা ব্যবহারকারীকে গাইড করে। এই গাইড দেখায় যে কীভাবে Navigation 3 এবং Navigation 2 Jetpack লাইব্রেরি, দুটির সাথেই শেয়ার করা এলিমেন্ট API ব্যবহার করতে হয়।
নিম্নলিখিত স্নিপেটে DetailsScreen এবং HomeScreen কম্পোজেবল অন্তর্ভুক্ত রয়েছে যা
ব্যবহারকারীরা নেভিগেট করতে পারেন এমন গন্তব্য হিসেবে কাজ করে। প্রতিটি স্ক্রিনের মধ্যে,
sharedElement মডিফায়ার ছবি ও টেক্সট, দুটির উপরেই ব্যবহার করা হয় যাতে
এইসব এলিমেন্টের প্রতিটি স্ক্রিনের মধ্যে স্বাধীনভাবে অ্যানিমেট করে।
@Composable fun DetailsScreen( id: Int, snack: Snack, sharedTransitionScope: SharedTransitionScope, animatedVisibilityScope: AnimatedVisibilityScope, onBackPressed: () -> Unit ) { with(sharedTransitionScope) { Column( modifier = Modifier .fillMaxSize() .clickable { onBackPressed() }, ) { Image( painterResource(id = snack.image), contentDescription = snack.description, contentScale = ContentScale.Crop, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$id"), animatedVisibilityScope = animatedVisibilityScope ) .aspectRatio(1f) .fillMaxWidth() ) Text( text = snack.name, fontSize = 18.sp, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "text-$id"), animatedVisibilityScope = animatedVisibilityScope ) .fillMaxWidth(), ) } } } @Composable fun HomeScreen( sharedTransitionScope: SharedTransitionScope, animatedVisibilityScope: AnimatedVisibilityScope, onItemClick: (Int) -> Unit, ) { LazyColumn( modifier = Modifier .fillMaxSize() .padding(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { itemsIndexed(listSnacks) { index, item -> Row( modifier = Modifier .fillMaxWidth() .clickable { onItemClick(index) }, ) { Spacer(modifier = Modifier.width(8.dp)) with(sharedTransitionScope) { Image( painterResource(id = item.image), contentDescription = item.description, contentScale = ContentScale.Crop, modifier = Modifier .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "image-$index"), animatedVisibilityScope = animatedVisibilityScope ) .size(100.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text( item.name, fontSize = 18.sp, modifier = Modifier .align(Alignment.CenterVertically) .sharedElement( sharedTransitionScope.rememberSharedContentState(key = "text-$index"), animatedVisibilityScope = animatedVisibilityScope, ) ) } } } } }
নেভিগেশন ৩
Navigation 3-এর সাথে শেয়ার করা এলিমেন্ট API ব্যবহার করতে, আপনাকে প্রথমে আপনার অ্যাপের
NavDisplay-কে SharedTransitionLayout-এ র্যাপ করতে হবে। তারপর আপনি স্ক্রিন কম্পোজেবলে
প্রদান করা SharedTransitionScope পাস করতে পারবেন।
AnimatedVisibilityScope-এর জন্য,
LocalNavAnimatedContentScope কম্পোজিশন লোকাল ব্যবহার করুন যা
AnimatedContentScope প্রদান করে AnimatedContent থেকে যা NavDisplay
দৃশ্যগুলির মধ্যে অ্যানিমেট করতে ইন্টার্নালি ব্যবহার করে।
@Composable fun SharedElement_Nav3() { SharedTransitionLayout { val backStack = rememberNavBackStack(HomeRoute) // Note: NavDisplay accepts a `sharedTransitionScope` parameter, which is used to animate // NavEntry instances between scenes. This parameter *isn't* required for shared element // or shared bounds transitioning elements between different NavEntry, as demonstrated in // this sample. // See https://developer.android.com/guide/navigation/navigation-3/animate-destinations#transition-nav-entries NavDisplay( modifier = Modifier.safeDrawingPadding(), backStack = backStack, entryProvider = entryProvider { entry<HomeRoute> { HomeScreen( sharedTransitionScope = this@SharedTransitionLayout, animatedVisibilityScope = LocalNavAnimatedContentScope.current, onItemClick = { backStack.add(DetailsRoute(it)) }) } entry<DetailsRoute> { detailsRoute -> val id = detailsRoute.item val snack = listSnacks[id] DetailsScreen( id = id, snack = snack, sharedTransitionScope = this@SharedTransitionLayout, animatedVisibilityScope = LocalNavAnimatedContentScope.current, onBackPressed = { backStack.removeLastOrNull() }, ) } }) } }
নেভিগেশন ২
Navigation 2-এর সাথে শেয়ার করা এলিমেন্ট API ব্যবহার করতে, আপনাকে প্রথমে আপনার অ্যাপের
NavHost-কে SharedTransitionLayout-এ র্যাপ করতে হবে। তারপর আপনি স্ক্রিন কম্পোজেবলে
SharedTransitionScope পাস করতে পারবেন।
composable বিল্ডারের content প্যারামিটার
রিসিভার হিসেবে AnimatedContentScope ব্যবহার করে, তাই আপনি সেই স্কোপ রেফারেন্স করতে
this@composable ব্যবহার করতে পারেন।
@Composable fun SharedElement_Nav2() { SharedTransitionLayout { val navController = rememberNavController() NavHost( navController = navController, startDestination = "home", modifier = Modifier.safeDrawingPadding() ) { composable("home") { HomeScreen( sharedTransitionScope = this@SharedTransitionLayout, animatedVisibilityScope = this@composable, onItemClick = { navController.navigate("details/$it") }) } composable( "details/{item}", arguments = listOf(navArgument("item") { type = NavType.IntType }) ) { backStackEntry -> val id = backStackEntry.arguments?.getInt("item") ?: 0 val snack = listSnacks[id] DetailsScreen( id = id, snack = snack, sharedTransitionScope = this@SharedTransitionLayout, animatedVisibilityScope = this@composable, onBackPressed = { navController.popBackStack() } ) } } } }
শেয়ার করা এলিমেন্টের সাথে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস
শেয়ার করা এলিমেন্টের সাথে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস ব্যবহার করতে, এইসব ধাপ অনুসরণ করুন:
Navigation 3-এর সব ভার্সনে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস কাজ করে। নেভিগেশন ২-এর জন্য,
navigation-compose-এর2.8.0রিলিজ বা তার পরবর্তী ভার্সন ব্যবহার করুন:[versions] androidx-navigation = "2.8.0" # Or higher [libraries] androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation" }dependencies { implementation(libs.androidx.navigation.compose) }Android 15 (API লেভেল 35) বা তার পরবর্তী যেকোনও ভার্সনে রান করা ডিভাইসে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস ডিফল্ট হিসেবে চালু করা থাকে। Android 14 (API লেভেল 34) অপারেটিং সিস্টেমের ডিভাইসের জন্য, আপনাকে ডেভেলপার বিকল্পে আগের ধাপে ফিরে যাওয়া সংক্রান্ত পূর্বাভাস সেটিং চালু করতে হবে।
আপনার অ্যাপ Android 14 বা তার আগের কোনও ভার্সনকে টার্গেট করলে, আপনাকে অবশ্যই
android:enableOnBackInvokedCallback="true"-কে<application>-এ বা আপনারAndroidManifest.xmlফাইলের নির্দিষ্ট<activity>এলিমেন্টে যোগ করতে হবে। আপনার অ্যাপ Android 15 বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, এই ফ্ল্যাগ প্রয়োজন নেই।<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application ... android:enableOnBackInvokedCallback="true"> </application> </manifest>