সাধারণ অ্যানিমেশন ব্যবহারের ক্ষেত্রে ম্যানেজ করার জন্য কম্পোজেবল ও মডিফায়ার বিল্ট-ইন থাকে।
বিল্ট-ইন অ্যানিমেটেড কম্পোজেবল
Compose-এ বেশ কিছু কম্পোজেবল আছে যা কন্টেন্ট দেখানো, লুকানো এবং লেআউট পরিবর্তনের অ্যানিমেশন দেখায়।
অ্যানিমেট করা উপস্থিতি ও অনুপস্থিতি
AnimatedVisibility
কম্পোজেবল, এর কন্টেন্টের উপস্থিতি ও অনুপস্থিতি অ্যানিমেট করে।
var visible by remember { mutableStateOf(true) } // Animated visibility will eventually remove the item from the composition once the animation has finished. AnimatedVisibility(visible) { // your composable here // ... }
ডিফল্ট হিসেবে, কন্টেন্ট ফেড-ইন ও বড় হয়ে দেখা যায় এবং ফেড-আউট ও ছোট হয়ে
অদৃশ্য হয়ে যায়। EnterTransition এবং ExitTransition অবজেক্ট নির্দিষ্ট করে
এই ট্রানজিশন কাস্টমাইজ করুন।
var visible by remember { mutableStateOf(true) } val density = LocalDensity.current AnimatedVisibility( visible = visible, enter = slideInVertically { // Slide in from 40 dp from the top. with(density) { -40.dp.roundToPx() } } + expandVertically( // Expand from the top. expandFrom = Alignment.Top ) + fadeIn( // Fade in with the initial alpha of 0.3f. initialAlpha = 0.3f ), exit = slideOutVertically() + shrinkVertically() + fadeOut() ) { Text( "Hello", Modifier .fillMaxWidth() .height(200.dp) ) }
আগের উদাহরণে যেমন দেখানো হয়েছে, আপনি একাধিক EnterTransition
বা ExitTransition অবজেক্টকে + অপারেটরের সাথে একত্রিত করতে পারেন এবং প্রতিটি অবজেক্টের আচরণ কাস্টমাইজ করার জন্য ঐচ্ছিক
প্যারামিটার গ্রহণ করে। আরও তথ্যের জন্য রেফারেন্স পৃষ্ঠা দেখুন।
প্রবেশ করা ও বেরিয়ে আসার ট্রানজিশনের উদাহরণ
AnimatedVisibility-এ এমন একটি ভ্যারিয়েন্টও আছে যা
MutableTransitionState আর্গুমেন্ট নেয়। এটি আপনাকে AnimatedVisibility কম্পোজেবল কম্পোজিশন ট্রিতে যোগ করার সাথে সাথেই
অ্যানিমেশন ট্রিগার করতে দেয়। এটি অ্যানিমেশন স্টেট
পর্যবেক্ষণ করার জন্যও উপযোগী।
// Create a MutableTransitionState<Boolean> for the AnimatedVisibility. val state = remember { MutableTransitionState(false).apply { // Start the animation immediately. targetState = true } } Column { AnimatedVisibility(visibleState = state) { Text(text = "Hello, world!") } // Use the MutableTransitionState to know the current animation state // of the AnimatedVisibility. Text( text = when { state.isIdle && state.currentState -> "Visible" !state.isIdle && state.currentState -> "Disappearing" state.isIdle && !state.currentState -> "Invisible" else -> "Appearing" } ) }
চাইল্ড এলিমেন্টের জন্য প্রবেশ করা ও বেরিয়ে আসার অ্যানিমেশন
AnimatedVisibility-এর মধ্যে থাকা কন্টেন্ট (সরাসরি বা পরোক্ষ চাইল্ড)
animateEnterExit
মডিফায়ার ব্যবহার করে তাদের প্রত্যেকের জন্য আলাদা অ্যানিমেশন আচরণ নির্দিষ্ট করতে পারে। এইসব চাইল্ডের প্রতিটির জন্য ভিজ্যুয়াল
এফেক্ট হল AnimatedVisibility কম্পোজেবলে নির্দিষ্ট করা অ্যানিমেশন এবং চাইল্ডের নিজস্ব এন্টার ও
এক্সিট অ্যানিমেশনের
কম্বিনেশন।
var visible by remember { mutableStateOf(true) } AnimatedVisibility( visible = visible, enter = fadeIn(), exit = fadeOut() ) { // Fade in/out the background and the foreground. Box( Modifier .fillMaxSize() .background(Color.DarkGray) ) { Box( Modifier .align(Alignment.Center) .animateEnterExit( // Slide in/out the inner box. enter = slideInVertically(), exit = slideOutVertically() ) .sizeIn(minWidth = 256.dp, minHeight = 64.dp) .background(Color.Red) ) { // Content of the notification… } } }
কিছু ক্ষেত্রে, আপনি হয়ত AnimatedVisibility-কে কোনও অ্যানিমেশন প্রয়োগ করতে দিতে চাইবেন না
যাতে বাচ্চারা প্রত্যেকে animateEnterExit-এর মাধ্যমে নিজেদের স্বতন্ত্র অ্যানিমেশন পেতে পারে। এটি করতে, AnimatedVisibility কম্পোজেবলে EnterTransition.None এবং
ExitTransition.None উল্লেখ করুন।
কাস্টম অ্যানিমেশন যোগ করুন
আপনি যদি বিল্ট-ইন এন্টার এবং এক্সিট অ্যানিমেশনের বাইরে কাস্টম অ্যানিমেশন এফেক্ট যোগ করতে চান, তাহলে AnimatedVisibility-এর জন্য কন্টেন্ট ল্যাম্বডার মধ্যে transition প্রপার্টি ব্যবহার করে অন্তর্নিহিত Transition ইনস্ট্যান্স অ্যাক্সেস করুন। ট্রানজিশন ইনস্ট্যান্সে যোগ করা যেকোনও অ্যানিমেশন
স্টেট AnimatedVisibility-এর এন্টার
ও এক্সিট অ্যানিমেশনের সাথে একই সময়ে চলবে। AnimatedVisibility অপেক্ষা করে যতক্ষণ না
Transition-এর সব অ্যানিমেশন শেষ হয়, তারপর এর কন্টেন্ট সরিয়ে দেয়।
Transition-এর থেকে আলাদাভাবে তৈরি করা এক্সিট অ্যানিমেশনের জন্য (যেমন
animate*AsState ব্যবহার করে), AnimatedVisibility সেগুলির জন্য অ্যাকাউন্ট করতে পারবে না,
এবং তাই সেগুলি শেষ হওয়ার আগে কন্টেন্ট কম্পোজেবল সরিয়ে দিতে পারে।
var visible by remember { mutableStateOf(true) } AnimatedVisibility( visible = visible, enter = fadeIn(), exit = fadeOut() ) { // this: AnimatedVisibilityScope // Use AnimatedVisibilityScope#transition to add a custom animation // to the AnimatedVisibility. val background by transition.animateColor(label = "color") { state -> if (state == EnterExitState.Visible) Color.Blue else Color.Gray } Box( modifier = Modifier .size(128.dp) .background(background) ) }
অ্যানিমেশন ম্যানেজ করার জন্য Transition ব্যবহার করার ব্যাপারে আরও জানতে, ট্রানজিশনের মাধ্যমে
একসাথে একাধিক প্রপার্টি অ্যানিমেট করুন নিবন্ধটি দেখুন।
টার্গেট স্টেট অনুযায়ী অ্যানিমেট করুন
AnimatedContent
কম্পোজেবল তার কন্টেন্ট অ্যানিমেট করে কারণ এটি টার্গেট স্টেটের উপর ভিত্তি করে পরিবর্তিত হয়।
Row { var count by remember { mutableIntStateOf(0) } Button(onClick = { count++ }) { Text("Add") } AnimatedContent( targetState = count, label = "animated content" ) { targetCount -> // Make sure to use `targetCount`, not `count`. Text(text = "Count: $targetCount") } }
ডিফল্ট হিসেবে, প্রাথমিক কন্টেন্ট ফেড আউট হয়ে যায় এবং তারপর টার্গেট কন্টেন্ট ফেড ইন হয়
(এই আচরণকে
ফেড থ্রু বলা হয়)।
আপনি transitionSpec প্যারামিটারে একটি
ContentTransform
অবজেক্ট নির্দিষ্ট করে এই অ্যানিমেশন আচরণ কাস্টমাইজ করতে পারেন। আপনি with ইনফিক্স ফাংশন ব্যবহার করে
EnterTransition অবজেক্টের সাথে
ExitTransition অবজেক্ট একত্রিত করে
ContentTransform-এর ইনস্ট্যান্স তৈরি করতে পারবেন। আপনি using ইনফিক্স ফাংশনের সাথে
ContentTransform অবজেক্ট অ্যাটাচ করে
SizeTransform প্রয়োগ করতে পারবেন।
AnimatedContent( targetState = count, transitionSpec = { // Compare the incoming number with the previous number. if (targetState > initialState) { // If the target number is larger, it slides up and fades in // while the initial (smaller) number slides up and fades out. slideInVertically { height -> height } + fadeIn() togetherWith slideOutVertically { height -> -height } + fadeOut() } else { // If the target number is smaller, it slides down and fades in // while the initial number slides down and fades out. slideInVertically { height -> -height } + fadeIn() togetherWith slideOutVertically { height -> height } + fadeOut() }.using( // Disable clipping since the faded slide-in/out should // be displayed out of bounds. SizeTransform(clip = false) ) }, label = "animated content" ) { targetCount -> Text(text = "$targetCount") }

EnterTransition টার্গেট কন্টেন্ট কীভাবে দেখানো হবে তা নির্ধারণ করে এবং
ExitTransition প্রাথমিক কন্টেন্ট কীভাবে অদৃশ্য হবে তা নির্ধারণ করে। AnimatedVisibility-এর জন্য উপলভ্য
EnterTransition এবং ExitTransition-এর সব ফাংশন ছাড়াও, AnimatedContent-এ slideIntoContainer
এবং slideOutOfContainer অফার করা হয়।
এগুলি হল slideInHorizontally/Vertically এবং
slideOutHorizontally/Vertically-এর সুবিধাজনক বিকল্প যা
প্রাথমিক কন্টেন্টের সাইজ এবং AnimatedContent কন্টেন্টের টার্গেট কন্টেন্টের উপর ভিত্তি করে
স্লাইড দূরত্ব গণনা করে।
SizeTransform নির্ধারণ করে যে প্রাথমিক ও টার্গেট কন্টেন্টের মধ্যে
সাইজ কীভাবে অ্যানিমেট করা উচিত। অ্যানিমেশন তৈরি করার সময়,
প্রাথমিক সাইজ ও টার্গেট সাইজ, দুটিতেই আপনার
অ্যাক্সেস থাকে। এছাড়াও, অ্যানিমেশনের সময় কন্টেন্ট কম্পোনেন্টের সাইজে ক্লিপ করা হবে কিনা
তা SizeTransform কন্ট্রোল করে।
var expanded by remember { mutableStateOf(false) } Surface( color = MaterialTheme.colorScheme.primary, onClick = { expanded = !expanded } ) { AnimatedContent( targetState = expanded, transitionSpec = { fadeIn(animationSpec = tween(150, 150)) togetherWith fadeOut(animationSpec = tween(150)) using SizeTransform { initialSize, targetSize -> if (targetState) { keyframes { // Expand horizontally first. IntSize(targetSize.width, initialSize.height) at 150 durationMillis = 300 } } else { keyframes { // Shrink vertically first. IntSize(initialSize.width, targetSize.height) at 150 durationMillis = 300 } } } }, label = "size transform" ) { targetExpanded -> if (targetExpanded) { Expanded() } else { ContentIcon() } } }

চাইল্ড এন্টার ও এক্সিট ট্রানজিশন অ্যানিমেট করুন
AnimatedVisibility-এর মতোই, animateEnterExit
মডিফায়ারটি AnimatedContent-এর কন্টেন্ট ল্যাম্বডার মধ্যে উপলভ্য। প্রত্যেকটি প্রত্যক্ষ বা পরোক্ষ
চাইল্ডের ক্ষেত্রে আলাদাভাবে EnterAnimation ও ExitAnimation প্রয়োগ করতে এটি
ব্যবহার করুন।
কাস্টম অ্যানিমেশন যোগ করুন
AnimatedVisibility-এর মতোই, transition ফিল্ডটি AnimatedContent-এর কন্টেন্ট ল্যাম্বডার মধ্যে উপলভ্য। AnimatedContent ট্রানজিশনের সাথে একই সময়ে চলে এমন কাস্টম অ্যানিমেশন
এফেক্ট তৈরি করতে এটি ব্যবহার করুন। আরও বিবরণের জন্য
updateTransition দেখুন।
দুটি লেআউটের মধ্যে অ্যানিমেট করুন
Crossfade ক্রসফেড অ্যানিমেশনের মাধ্যমে দুটি লেআউটের মধ্যে অ্যানিমেট করে। current প্যারামিটারে পাস করা ভ্যালু টগল করার মাধ্যমে, ক্রসফেড অ্যানিমেশনের সাথে কন্টেন্ট
সুইচ করা হয়।
var currentPage by remember { mutableStateOf("A") } Crossfade(targetState = currentPage, label = "cross fade") { screen -> when (screen) { "A" -> Text("Page A") "B" -> Text("Page B") } }
বিল্ট-ইন অ্যানিমেশন মডিফায়ার
কম্পোজেবল-এ সরাসরি নির্দিষ্ট পরিবর্তন অ্যানিমেট করার জন্য Compose মডিফায়ার প্রদান করে।
কম্পোজেবল সাইজের পরিবর্তন অ্যানিমেট করা
animateContentSize মডিফায়ার সাইজ পরিবর্তনের অ্যানিমেশন দেখায়।
var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .background(colorBlue) .animateContentSize() .height(if (expanded) 400.dp else 200.dp) .fillMaxWidth() .clickable( interactionSource = remember { MutableInteractionSource() }, indication = null ) { expanded = !expanded } ) { }
তালিকা আইটেম অ্যানিমেশন
আপনি যদি Lazy তালিকা বা গ্রিডের মধ্যে আইটেম রিঅর্ডার অ্যানিমেট করতে চান, তাহলে Lazy লেআউট আইটেম অ্যানিমেশন ডকুমেন্টেশন দেখুন।
আপনার জন্য সাজেস্ট করা হয়েছে
- মনে রাখবেন: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট দেখানো হয়
- ভ্যালু-ভিত্তিক অ্যানিমেশন
- Compose-এ অ্যানিমেশন
- অ্যানিমেশন টুলিং সহায়তা {:#tooling}