Compose में ऐनिमेशन के इस्तेमाल के लिए गाइड

Compose में, ऐनिमेशन के कई बिल्ट-इन मैकेनिज़्म होते हैं. इसलिए, यह तय करना मुश्किल हो सकता है कि इनमें से कौनसे मैकेनिज़्म का इस्तेमाल किया जाए. यहां, ऐनिमेशन के सामान्य इस्तेमाल के उदाहरण दिए गए हैं. Compose में, अलग-अलग एपीआई के सभी विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए, Compose में ऐनिमेशन से जुड़ा पूरा दस्तावेज़ पढ़ें.

सामान्य कंपोज़ेबल प्रॉपर्टी को ऐनिमेट करना

Compose में, ऐसे एपीआई उपलब्ध हैं जिनकी मदद से, ऐनिमेशन के सामान्य इस्तेमाल के कई उदाहरणों को हल किया जा सकता है. इस सेक्शन में, कंपोज़ेबल की सामान्य प्रॉपर्टी को ऐनिमेट करने का तरीका बताया गया है.

दिखने / गायब होने के ऐनिमेशन

ग्रीन कंपोज़ेबल, खुद को दिखाता और छिपाता हुआ
पहली इमेज. कॉलम में किसी आइटम के दिखने और गायब होने का ऐनिमेशन

किसी कंपोज़ेबल को छिपाने या दिखाने के लिए, AnimatedVisibility का इस्तेमाल करें. AnimatedVisibility में मौजूद चाइल्ड, अपने दिखने या गायब होने के ट्रांज़िशन के लिए Modifier.animateEnterExit() का इस्तेमाल कर सकते हैं.

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

AnimatedVisibility के enter और exit पैरामीटर की मदद से, यह कॉन्फ़िगर किया जा सकता है कि कोई कंपोज़ेबल, दिखने और गायब होने पर कैसा दिखेगा. ज़्यादा जानकारी के लिए, पूरा दस्तावेज़ पढ़ें.

किसी कंपोज़ेबल की विज़िबिलिटी को ऐनिमेट करने का एक और विकल्प है. इसके लिए, अल्फ़ा को ऐनिमेट किया जा सकता है. इसके लिए, animateFloatAsState का इस्तेमाल किया जा सकता है:

var visible by remember {
    mutableStateOf(true)
}
val animatedAlpha by animateFloatAsState(
    targetValue = if (visible) 1.0f else 0f,
    label = "alpha"
)
Box(
    modifier = Modifier
        .size(200.dp)
        .graphicsLayer {
            alpha = animatedAlpha
        }
        .clip(RoundedCornerShape(8.dp))
        .background(colorGreen)
        .align(Alignment.TopCenter)
) {
}

हालांकि, अल्फ़ा में बदलाव करने पर, कंपोज़ेबल कंपोज़िशन में बना रहता है और उस जगह को घेरता रहता है जहां उसे रखा गया है. इसकी वजह से, स्क्रीन रीडर और सुलभता के अन्य मैकेनिज़्म, स्क्रीन पर मौजूद आइटम को अब भी देख सकते हैं. वहीं दूसरी ओर, AnimatedVisibility कंपोज़िशन से आइटम को हटा देता है.

किसी कंपोज़ेबल के ऐल्फ़ा को ऐनिमेट करना
दूसरी इमेज. किसी कंपोज़ेबल के अल्फ़ा को ऐनिमेट करना

बैकग्राउंड के रंग को ऐनिमेट करना

इसमें बैकग्राउंड का रंग समय के साथ बदलता है. साथ ही, रंग एक-दूसरे में घुलते-मिलते हैं.
तीसरी इमेज. कंपोज़ेबल के बैकग्राउंड के रंग को ऐनिमेट करना

val animatedColor by animateColorAsState(
    if (animateBackgroundColor) colorGreen else colorBlue,
    label = "color"
)
Column(
    modifier = Modifier.drawBehind {
        drawRect(animatedColor)
    }
) {
    // your composable here
}

यह विकल्प, Modifier.background() का इस्तेमाल करने से ज़्यादा बेहतर परफ़ॉर्म करता है. Modifier.background() का इस्तेमाल, रंग की सेटिंग को एक बार बदलने के लिए किया जा सकता है. हालांकि, समय के साथ रंग को ऐनिमेट करने पर, इससे ज़रूरत से ज़्यादा बार रीकंपोज़िशन हो सकता है.

बैकग्राउंड के रंग को लगातार ऐनिमेट करने के लिए, ऐनिमेशन को दोहराना सेक्शन देखें.

किसी कंपोज़ेबल के साइज़ को ऐनिमेट करना

हरे रंग का कंपोज़ेबल, जिसके साइज़ में आसानी से बदलाव हो रहा है.
चौथी इमेज. कंपोज़ेबल, छोटे और बड़े साइज़ के बीच आसानी से ऐनिमेट हो रहा है

Compose में, कंपोज़ेबल के साइज़ को कुछ अलग-अलग तरीकों से ऐनिमेट किया जा सकता है. कंपोज़ेबल के साइज़ में बदलाव के बीच ऐनिमेशन के लिए, animateContentSize() का इस्तेमाल करें.

उदाहरण के लिए, अगर आपके पास कोई ऐसा बॉक्स है जिसमें टेक्स्ट है और वह एक से ज़्यादा लाइनों में फैल सकता है, तो बेहतर ट्रांज़िशन के लिए Modifier.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
        }

) {
}

AnimatedContent का इस्तेमाल, SizeTransform के साथ भी किया जा सकता है. इससे यह बताया जा सकता है कि साइज़ में बदलाव कैसे होने चाहिए.

कंपोज़ेबल की पोज़िशन को ऐनिमेट करना

नीचे और दाईं ओर आसानी से ऐनिमेशन करने वाला हरा कंपोज़ेबल
पांचवी इमेज. ऑफ़सेट से कंपोज़ेबल की पोज़िशन में बदलाव

किसी कंपोज़ेबल की पोज़िशन को ऐनिमेट करने के लिए, Modifier.offset{ } का इस्तेमाल animateIntOffsetAsState() के साथ करें.

var moved by remember { mutableStateOf(false) }
val pxToMove = with(LocalDensity.current) {
    100.dp.toPx().roundToInt()
}
val offset by animateIntOffsetAsState(
    targetValue = if (moved) {
        IntOffset(pxToMove, pxToMove)
    } else {
        IntOffset.Zero
    },
    label = "offset"
)

Box(
    modifier = Modifier
        .offset {
            offset
        }
        .background(colorBlue)
        .size(100.dp)
        .clickable(
            interactionSource = remember { MutableInteractionSource() },
            indication = null
        ) {
            moved = !moved
        }
)

अगर आपको यह पक्का करना है कि पोज़िशन या साइज़ को ऐनिमेट करते समय, कंपोज़ेबल दूसरे कंपोज़ेबल के ऊपर या नीचे न दिखें, तो Modifier.layout{ } का इस्तेमाल करें. यह मॉडिफ़ायर, पैरंट को साइज़ और पोज़िशन में होने वाले बदलावों के बारे में बताता है. इससे अन्य चाइल्ड पर असर पड़ता है.

उदाहरण के लिए, अगर किसी Box को Column में ले जाया जा रहा है और Box के मूव होने पर अन्य चाइल्ड को भी मूव करना है, तो ऑफ़सेट की जानकारी को Modifier.layout{ } के साथ इस तरह शामिल करें:

var toggled by remember {
    mutableStateOf(false)
}
val interactionSource = remember {
    MutableInteractionSource()
}
Column(
    modifier = Modifier
        .padding(16.dp)
        .fillMaxSize()
        .clickable(indication = null, interactionSource = interactionSource) {
            toggled = !toggled
        }
) {
    val offsetTarget = if (toggled) {
        IntOffset(150, 150)
    } else {
        IntOffset.Zero
    }
    val offset = animateIntOffsetAsState(
        targetValue = offsetTarget, label = "offset"
    )
    Box(
        modifier = Modifier
            .size(100.dp)
            .background(colorBlue)
    )
    Box(
        modifier = Modifier
            .layout { measurable, constraints ->
                val offsetValue = if (isLookingAhead) offsetTarget else offset.value
                val placeable = measurable.measure(constraints)
                layout(placeable.width + offsetValue.x, placeable.height + offsetValue.y) {
                    placeable.placeRelative(offsetValue)
                }
            }
            .size(100.dp)
            .background(colorGreen)
    )
    Box(
        modifier = Modifier
            .size(100.dp)
            .background(colorBlue)
    )
}

दो बॉक्स हैं. दूसरे बॉक्स की X,Y पोज़िशन ऐनिमेट हो रही है. तीसरा बॉक्स, Y की वैल्यू के हिसाब से खुद को मूव करके रिस्पॉन्स दे रहा है.
छठी इमेज. Modifier.layout{ }
की मदद से ऐनिमेट करना

किसी कंपोज़ेबल के पैडिंग को ऐनिमेट करना

क्लिक करने पर, हरे रंग का कंपोज़ेबल छोटा और बड़ा हो रहा है. साथ ही, पैडिंग में ऐनिमेशन हो रहा है
सातवीं इमेज. कंपोज़ेबल के पैडिंग को ऐनिमेट करना

किसी कंपोज़ेबल के पैडिंग को ऐनिमेट करने के लिए, animateDpAsState का इस्तेमाल Modifier.padding() के साथ करें:

var toggled by remember {
    mutableStateOf(false)
}
val animatedPadding by animateDpAsState(
    if (toggled) {
        0.dp
    } else {
        20.dp
    },
    label = "padding"
)
Box(
    modifier = Modifier
        .aspectRatio(1f)
        .fillMaxSize()
        .padding(animatedPadding)
        .background(Color(0xff53D9A1))
        .clickable(
            interactionSource = remember { MutableInteractionSource() },
            indication = null
        ) {
            toggled = !toggled
        }
)

किसी कंपोज़ेबल के एलिवेशन को ऐनिमेट करना

आठवीं इमेज. क्लिक करने पर, कंपोज़ेबल के एलिवेशन को ऐनिमेट करना

किसी कंपोज़ेबल के एलिवेशन को ऐनिमेट करने के लिए, animateDpAsState का इस्तेमाल Modifier.graphicsLayer{ } के साथ करें. एलिवेशन में एक बार बदलाव करने के लिए, Modifier.shadow() का इस्तेमाल करें. अगर शैडो को ऐनिमेट किया जा रहा है, तो Modifier.graphicsLayer{ } मॉडिफ़ायर का इस्तेमाल करना ज़्यादा बेहतर विकल्प है.

val mutableInteractionSource = remember {
    MutableInteractionSource()
}
val pressed = mutableInteractionSource.collectIsPressedAsState()
val elevation = animateDpAsState(
    targetValue = if (pressed.value) {
        32.dp
    } else {
        8.dp
    },
    label = "elevation"
)
Box(
    modifier = Modifier
        .size(100.dp)
        .align(Alignment.Center)
        .graphicsLayer {
            this.shadowElevation = elevation.value.toPx()
        }
        .clickable(interactionSource = mutableInteractionSource, indication = null) {
        }
        .background(colorGreen)
) {
}

इसके अलावा, Card कंपोज़ेबल का इस्तेमाल करें और हर स्थिति के लिए, एलिवेशन प्रॉपर्टी की वैल्यू अलग-अलग सेट करें.

टेक्स्ट के स्केल, ट्रांसलेशन या रोटेशन को ऐनिमेट करना

टेक्स्ट कंपोज़ेबल से जुड़ी जानकारी
नौवीं इमेज. टेक्स्ट के दो साइज़ के बीच आसानी से ऐनिमेट होना

टेक्स्ट के स्केल, ट्रांसलेशन या रोटेशन को ऐनिमेट करते समय, textMotion पैरामीटर को TextStyle पर TextMotion.Animated सेट करें. इससे टेक्स्ट ऐनिमेशन के बीच बेहतर ट्रांज़िशन मिलते हैं. टेक्स्ट को ट्रांसलेट, रोटेट या स्केल करने के लिए, Modifier.graphicsLayer{ } का इस्तेमाल करें.

val infiniteTransition = rememberInfiniteTransition(label = "infinite transition")
val scale by infiniteTransition.animateFloat(
    initialValue = 1f,
    targetValue = 8f,
    animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse),
    label = "scale"
)
Box(modifier = Modifier.fillMaxSize()) {
    Text(
        text = "Hello",
        modifier = Modifier
            .graphicsLayer {
                scaleX = scale
                scaleY = scale
                transformOrigin = TransformOrigin.Center
            }
            .align(Alignment.Center),
        // Text composable does not take TextMotion as a parameter.
        // Provide it via style argument but make sure that we are copying from current theme
        style = LocalTextStyle.current.copy(textMotion = TextMotion.Animated)
    )
}

टेक्स्ट के रंग को ऐनिमेट करना

ये शब्द
10वीं इमेज. टेक्स्ट के रंग को ऐनिमेट करने का उदाहरण

टेक्स्ट के रंग को ऐनिमेट करने के लिए, BasicText कंपोज़ेबल पर color लैम्डा का इस्तेमाल करें:

val infiniteTransition = rememberInfiniteTransition(label = "infinite transition")
val animatedColor by infiniteTransition.animateColor(
    initialValue = Color(0xFF60DDAD),
    targetValue = Color(0xFF4285F4),
    animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse),
    label = "color"
)

BasicText(
    text = "Hello Compose",
    color = {
        animatedColor
    },
    // ...
)

अलग-अलग तरह के कॉन्टेंट के बीच स्विच करना

ग्रीन स्क्रीन पर लिखा है
11वीं इमेज. अलग-अलग कंपोज़ेबल के बीच बदलावों को ऐनिमेट करने के लिए, AnimatedContent का इस्तेमाल करना (धीमी गति से)

अलग-अलग कंपोज़ेबल के बीच ऐनिमेशन के लिए, AnimatedContent का इस्तेमाल करें. अगर आपको कंपोज़ेबल के बीच सिर्फ़ फ़ेड इन और फ़ेड आउट का स्टैंडर्ड ऐनिमेशन चाहिए, तो Crossfade का इस्तेमाल करें.

var state by remember {
    mutableStateOf(UiState.Loading)
}
AnimatedContent(
    state,
    transitionSpec = {
        fadeIn(
            animationSpec = tween(3000)
        ) togetherWith fadeOut(animationSpec = tween(3000))
    },
    modifier = Modifier.clickable(
        interactionSource = remember { MutableInteractionSource() },
        indication = null
    ) {
        state = when (state) {
            UiState.Loading -> UiState.Loaded
            UiState.Loaded -> UiState.Error
            UiState.Error -> UiState.Loading
        }
    },
    label = "Animated Content"
) { targetState ->
    when (targetState) {
        UiState.Loading -> {
            LoadingScreen()
        }
        UiState.Loaded -> {
            LoadedScreen()
        }
        UiState.Error -> {
            ErrorScreen()
        }
    }
}

AnimatedContent को, दिखने और गायब होने के कई अलग-अलग ट्रांज़िशन दिखाने के लिए, अपनी पसंद के मुताबिक बनाया जा सकता है. ज़्यादा जानकारी के लिए, AnimatedContent से जुड़ा दस्तावेज़ पढ़ें या AnimatedContent के बारे में यह ब्लॉग पोस्ट पढ़ें.

अलग-अलग डेस्टिनेशन पर नेविगेट करते समय ऐनिमेशन दिखाना

दो कंपोज़ेबल हैं. एक हरे रंग का है, जिस पर लैंडिंग लिखा है. दूसरा नीले रंग का है, जिस पर जानकारी लिखा है. इसमें, जानकारी वाले कंपोज़ेबल को लैंडिंग वाले कंपोज़ेबल के ऊपर स्लाइड करके ऐनिमेशन दिखाया गया है.
12वीं इमेज. navigation-compose का इस्तेमाल करके, कंपोज़ेबल के बीच ऐनिमेशन दिखाना

navigation-compose आर्टफ़ैक्ट का इस्तेमाल करते समय, कंपोज़ेबल के बीच ट्रांज़िशन को ऐनिमेट करने के लिए, किसी कंपोज़ेबल पर enterTransition और exitTransition के बारे में बताएं. सबसे ऊपर के लेवल पर मौजूद NavHost के सभी डेस्टिनेशन के लिए, डिफ़ॉल्ट ऐनिमेशन भी सेट किया जा सकता है:

val navController = rememberNavController()
NavHost(
    navController = navController, startDestination = "landing",
    enterTransition = { EnterTransition.None },
    exitTransition = { ExitTransition.None }
) {
    composable("landing") {
        ScreenLanding(
            // ...
        )
    }
    composable(
        "detail/{photoUrl}",
        arguments = listOf(navArgument("photoUrl") { type = NavType.StringType }),
        enterTransition = {
            fadeIn(
                animationSpec = tween(
                    300, easing = LinearEasing
                )
            ) + slideIntoContainer(
                animationSpec = tween(300, easing = EaseIn),
                towards = AnimatedContentTransitionScope.SlideDirection.Start
            )
        },
        exitTransition = {
            fadeOut(
                animationSpec = tween(
                    300, easing = LinearEasing
                )
            ) + slideOutOfContainer(
                animationSpec = tween(300, easing = EaseOut),
                towards = AnimatedContentTransitionScope.SlideDirection.End
            )
        }
    ) { backStackEntry ->
        ScreenDetails(
            // ...
        )
    }
}

दिखने और गायब होने के कई अलग-अलग ट्रांज़िशन होते हैं. इनसे, आने वाले और जाने वाले कॉन्टेंट पर अलग-अलग इफ़ेक्ट लागू होते हैं. ज़्यादा जानकारी के लिए, दस्तावेज़ देखें.

किसी ऐनिमेशन को दोहराना

हरे रंग का बैकग्राउंड, जो नीले रंग के बैकग्राउंड में बदल जाता है. यह बदलाव, दोनों रंगों के बीच ऐनिमेशन के ज़रिए लगातार होता रहता है.
13वीं इमेज. बैकग्राउंड के रंग को दो वैल्यू के बीच लगातार ऐनिमेट करना

अपने ऐनिमेशन को लगातार दोहराने के लिए, rememberInfiniteTransition का इस्तेमाल infiniteRepeatable animationSpec के साथ करें. यह तय करने के लिए कि ऐनिमेशन को आगे-पीछे कैसे दोहराना है, RepeatModes में बदलाव करें.

किसी ऐनिमेशन को तय संख्या में दोहराने के लिए, repeatable का इस्तेमाल करें.

val infiniteTransition = rememberInfiniteTransition(label = "infinite")
val color by infiniteTransition.animateColor(
    initialValue = Color.Green,
    targetValue = Color.Blue,
    animationSpec = infiniteRepeatable(
        animation = tween(1000, easing = LinearEasing),
        repeatMode = RepeatMode.Reverse
    ),
    label = "color"
)
Column(
    modifier = Modifier.drawBehind {
        drawRect(color)
    }
) {
    // your composable here
}

किसी कंपोज़ेबल के लॉन्च होने पर ऐनिमेशन शुरू करना

LaunchedEffect , कंपोज़ेबल के कंपोज़िशन में शामिल होने पर चलता है. यह किसी कंपोज़ेबल के लॉन्च होने पर ऐनिमेशन शुरू करता है. इसका इस्तेमाल, ऐनिमेशन की स्थिति में बदलाव लाने के लिए किया जा सकता है. लॉन्च होने पर ऐनिमेशन शुरू करने के लिए, Animatable का इस्तेमाल animateTo तरीके के साथ करना:

val alphaAnimation = remember {
    Animatable(0f)
}
LaunchedEffect(Unit) {
    alphaAnimation.animateTo(1f)
}
Box(
    modifier = Modifier.graphicsLayer {
        alpha = alphaAnimation.value
    }
)

सीक्वेंशियल ऐनिमेशन बनाना

चार सर्कल हैं. इनके बीच में हरे रंग के ऐरो हैं. ये ऐरो एक के बाद एक ऐनिमेट हो रहे हैं.
14वीं इमेज. डायग्राम में दिखाया गया है कि सीक्वेंशियल ऐनिमेशन, एक-एक करके कैसे आगे बढ़ता है.

सीक्वेंशियल या कॉन्करेंट ऐनिमेशन करने के लिए, Animatable को-रूटीन एपीआई का इस्तेमाल करें. Animatable पर एक के बाद एक animateTo को कॉल करने से, हर ऐनिमेशन को आगे बढ़ने से पहले, पिछले ऐनिमेशन के खत्म होने का इंतज़ार करना पड़ता है . ऐसा इसलिए होता है, क्योंकि यह सस्पेंड फ़ंक्शन है.

val alphaAnimation = remember { Animatable(0f) }
val yAnimation = remember { Animatable(0f) }

LaunchedEffect("animationKey") {
    alphaAnimation.animateTo(1f)
    yAnimation.animateTo(100f)
    yAnimation.animateTo(500f, animationSpec = tween(100))
}

कॉन्करेंट ऐनिमेशन बनाना

तीन सर्कल, जिनमें हरे रंग के ऐरो हैं. ये ऐरो हर सर्कल में ऐनिमेशन के साथ घूम रहे हैं. साथ ही, ये सभी ऐरो एक साथ ऐनिमेशन के साथ घूम रहे हैं.
15वीं इमेज. डायग्राम में दिखाया गया है कि कॉन्करेंट ऐनिमेशन, एक ही समय पर कैसे आगे बढ़ते हैं.

कॉन्करेंट ऐनिमेशन करने के लिए, को-रूटीन एपीआई (Animatable#animateTo() या animate) या Transition एपीआई का इस्तेमाल करें. अगर को-रूटीन कॉन्टेक्स्ट में एक से ज़्यादा लॉन्च फ़ंक्शन का इस्तेमाल किया जाता है, तो यह ऐनिमेशन को एक ही समय पर लॉन्च करता है:

val alphaAnimation = remember { Animatable(0f) }
val yAnimation = remember { Animatable(0f) }

LaunchedEffect("animationKey") {
    launch {
        alphaAnimation.animateTo(1f)
    }
    launch {
        yAnimation.animateTo(100f)
    }
}

updateTransition एपीआई का इस्तेमाल करके, एक ही स्थिति का इस्तेमाल, एक ही समय पर कई अलग-अलग प्रॉपर्टी ऐनिमेशन को चलाने के लिए किया जा सकता है. नीचे दिए गए उदाहरण में, स्थिति में बदलाव से कंट्रोल होने वाली दो प्रॉपर्टी, rect और borderWidth को ऐनिमेट किया गया है:

var currentState by remember { mutableStateOf(BoxState.Collapsed) }
val transition = updateTransition(currentState, label = "transition")

val rect by transition.animateRect(label = "rect") { state ->
    when (state) {
        BoxState.Collapsed -> Rect(0f, 0f, 100f, 100f)
        BoxState.Expanded -> Rect(100f, 100f, 300f, 300f)
    }
}
val borderWidth by transition.animateDp(label = "borderWidth") { state ->
    when (state) {
        BoxState.Collapsed -> 1.dp
        BoxState.Expanded -> 0.dp
    }
}

ऐनिमेशन की परफ़ॉर्मेंस ऑप्टिमाइज़ करना

Compose में ऐनिमेशन की वजह से, परफ़ॉर्मेंस से जुड़ी समस्याएं आ सकती हैं. ऐसा इसलिए होता है, क्योंकि ऐनिमेशन का मतलब है: स्क्रीन पर पिक्सल को तेज़ी से, फ़्रेम-दर-फ़्रेम मूव करना या उनमें बदलाव करना, ताकि मूवमेंट का भ्रम पैदा किया जा सके.

Compose के अलग-अलग फ़ेज़ के बारे में जानें: कंपोज़िशन, लेआउट, और ड्रॉ. अगर आपका ऐनिमेशन, लेआउट फ़ेज़ में बदलाव करता है, तो इससे प्रभावित होने वाले सभी कंपोज़ेबल को फिर से लेआउट और रीड्रॉ करना पड़ता है. अगर आपका ऐनिमेशन, ड्रॉ फ़ेज़ में होता है, तो यह डिफ़ॉल्ट रूप से, लेआउट फ़ेज़ में ऐनिमेशन चलाने से ज़्यादा बेहतर परफ़ॉर्म करता है. ऐसा इसलिए, क्योंकि इसे कुल मिलाकर कम काम करना पड़ता है.

यह पक्का करने के लिए कि ऐनिमेशन के दौरान आपका ऐप्लिकेशन कम से कम काम करे, जहां हो सके वहां Modifier के लैम्डा वर्शन को चुनें. इससे रीकंपोज़िशन नहीं होता और ऐनिमेशन, कंपोज़िशन फ़ेज़ के बाहर होता है. इसके अलावा, Modifier.graphicsLayer{ } का इस्तेमाल करें, क्योंकि यह मॉडिफ़ायर हमेशा ड्रॉ फ़ेज़ में चलता है. इस बारे में ज़्यादा जानकारी के लिए, परफ़ॉर्मेंस से जुड़े दस्तावेज़ में, रीड को डिफ़र करना सेक्शन देखें.

ऐनिमेशन का समय बदलना

Compose, ज़्यादातर ऐनिमेशन के लिए डिफ़ॉल्ट रूप से स्प्रिंग ऐनिमेशन का इस्तेमाल करता है. स्प्रिंग या फ़िज़िक्स पर आधारित ऐनिमेशन, ज़्यादा नैचुरल लगते हैं. इन्हें रोका भी जा सकता है, क्योंकि ये तय समय के बजाय, ऑब्जेक्ट की मौजूदा वेलोसिटी को ध्यान में रखते हैं. अगर आपको डिफ़ॉल्ट सेटिंग बदलनी है, तो ऊपर बताए गए सभी ऐनिमेशन एपीआई में animationSpec सेट करने की सुविधा होती है. इससे यह तय किया जा सकता है कि कोई ऐनिमेशन कैसे चलेगा. उदाहरण के लिए, अगर आपको यह तय करना है कि ऐनिमेशन किसी तय अवधि में चले या ज़्यादा बाउंस हो.

animationSpec के अलग-अलग विकल्पों की खास जानकारी यहां दी गई है:

  • spring: फ़िज़िक्स पर आधारित ऐनिमेशन. यह सभी ऐनिमेशन के लिए डिफ़ॉल्ट सेटिंग है. ऐनिमेशन के लुक और फ़ील को अलग बनाने के लिए, स्टिफ़नेस या डैंपिंग रेशियो बदला जा सकता है.
  • tween (बिटवीन का शॉर्ट फ़ॉर्म): अवधि के आधार पर ऐनिमेशन. यह Easing फ़ंक्शन के साथ, दो वैल्यू के बीच ऐनिमेट होता है.
  • keyframes: किसी ऐनिमेशन में, तय किए गए की पॉइंट पर वैल्यू तय करने के लिए स्पेसिफ़िकेशन.
  • repeatable: अवधि के आधार पर स्पेसिफ़िकेशन. यह RepeatMode से तय की गई संख्या में चलता है.
  • infiniteRepeatable: अवधि के आधार पर स्पेसिफ़िकेशन. यह हमेशा चलता रहता है.
  • snap: बिना किसी ऐनिमेशन के, तुरंत आखिरी वैल्यू पर स्नैप हो जाता है.
वैकल्पिक टेक्स्ट यहां लिखें
16वीं इमेज. कोई स्पेसिफ़िकेशन सेट नहीं किया गया है बनाम कस्टम स्प्रिंग स्पेसिफ़िकेशन सेट किया गया है

animationSpec के बारे में ज़्यादा जानकारी के लिए, पूरा दस्तावेज़ पढ़ें.

अन्य संसाधन

Compose में मज़ेदार ऐनिमेशन के ज़्यादा उदाहरण देखने के लिए, इन्हें देखें: