कस्टम ट्रांज़िशन ऐनिमेशन बनाएं

'लिखें' सुविधा आज़माएं
Android के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर सुझाया जाता है. Compose में ऐनिमेशन जोड़ने का तरीका जानें.

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

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

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

ट्रांज़िशन क्लास को बड़ा करना

कस्टम ट्रांज़िशन बनाने के लिए, अपने प्रोजेक्ट में ऐसी क्लास जोड़ें जो Transition क्लास को एक्सटेंड करती हो. साथ ही, नीचे दिए गए स्निपेट में दिखाए गए फ़ंक्शन को ओवरराइड करें:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

इन सेक्शन में, इन फ़ंक्शन को बदलने का तरीका बताया गया है.

व्यू प्रॉपर्टी की वैल्यू कैप्चर करना

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

हालांकि, आम तौर पर प्रॉपर्टी ऐनिमेशन के लिए, व्यू की सभी प्रॉपर्टी वैल्यू के सिर्फ़ एक छोटे सबसेट की ज़रूरत होती है. उदाहरण के लिए, कलर ऐनिमेशन के लिए कलर प्रॉपर्टी की वैल्यू की ज़रूरत होती है, जबकि मूवमेंट ऐनिमेशन के लिए पोज़िशन प्रॉपर्टी की वैल्यू की ज़रूरत होती है. ऐनिमेशन के लिए ज़रूरी प्रॉपर्टी वैल्यू, ट्रांज़िशन के हिसाब से होती हैं. इसलिए, ट्रांज़िशन फ़्रेमवर्क हर प्रॉपर्टी वैल्यू को ट्रांज़िशन के लिए उपलब्ध नहीं कराता. इसके बजाय, फ़्रेमवर्क कॉलबैक फ़ंक्शन को कॉल करता है. इनकी मदद से, ट्रांज़िशन सिर्फ़ उन प्रॉपर्टी वैल्यू को कैप्चर कर पाता है जिनकी उसे ज़रूरत होती है और उन्हें फ़्रेमवर्क में सेव करता है.

शुरुआती वैल्यू कैप्चर करना

फ़्रेमवर्क में शुरुआती व्यू की वैल्यू पास करने के लिए, captureStartValues(transitionValues) फ़ंक्शन लागू करें. फ़्रेमवर्क, शुरुआती सीन में हर व्यू के लिए इस फ़ंक्शन को कॉल करता है. फ़ंक्शन आर्ग्युमेंट एक TransitionValues ऑब्जेक्ट होता है. इसमें व्यू का रेफ़रंस और Map इंस्टेंस होता है. इसमें अपनी पसंद के हिसाब से व्यू की वैल्यू सेव की जा सकती हैं. लागू करने के दौरान, इन प्रॉपर्टी वैल्यू को फिर से पाएं और उन्हें मैप में स्टोर करके, फ़्रेमवर्क में वापस भेजें.

यह पक्का करने के लिए कि किसी प्रॉपर्टी वैल्यू की कुंजी, अन्य TransitionValues कुंजियों से मेल न खाए, नाम रखने के लिए इस स्कीम का इस्तेमाल करें:

package_name:transition_name:property_name

नीचे दिया गया स्निपेट, captureStartValues() फ़ंक्शन को लागू करने का तरीका दिखाता है:

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

आखिरी वैल्यू कैप्चर करना

फ़्रेमवर्क, आखिरी सीन में हर टारगेट व्यू के लिए, captureEndValues(TransitionValues) फ़ंक्शन को एक बार कॉल करता है. बाकी सभी मामलों में, captureEndValues() captureStartValues() की तरह ही काम करता है.

नीचे दिया गया कोड स्निपेट, captureEndValues() फ़ंक्शन को लागू करने का तरीका दिखाता है:

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

इस उदाहरण में, captureStartValues() और captureEndValues() दोनों फ़ंक्शन, वैल्यू को वापस पाने और सेव करने के लिए captureValues() को कॉल करते हैं. captureValues(), व्यू प्रॉपर्टी को एक ही तरह से फिर से हासिल करता है. हालांकि, शुरुआत और आखिर में दिखने वाले सीन में इसकी वैल्यू अलग-अलग होती हैं. फ़्रेमवर्क, व्यू के शुरू और खत्म होने की स्थितियों के लिए अलग-अलग मैप बनाए रखता है.

कस्टम ऐनिमेशन बनाने वाला टूल बनाना

किसी व्यू की शुरुआती स्थिति और आखिरी स्थिति के बीच हुए बदलावों को ऐनिमेट करने के लिए, createAnimator() फ़ंक्शन को बदलकर ऐनिमेशन दें. जब फ़्रेमवर्क इस फ़ंक्शन को कॉल करता है, तो यह सीन रूट व्यू और उन TransitionValues ऑब्जेक्ट में पास हो जाता है जिनमें आपने कैप्चर की गई शुरुआती और आखिरी वैल्यू शामिल की है.

फ़्रेमवर्क, createAnimator() फ़ंक्शन को कितनी बार कॉल करता है, यह इस बात पर निर्भर करता है कि शुरू और खत्म होने वाले सीन के बीच क्या बदलाव हुए हैं.

उदाहरण के लिए, पसंद के मुताबिक ट्रांज़िशन के तौर पर लागू किए गए फ़ेड-आउट या फ़ेड-इन ऐनिमेशन पर विचार करें. अगर शुरुआती सीन में पांच टारगेट हैं, जिनमें से दो को आखिरी सीन से हटा दिया गया है और आखिरी सीन में शुरुआती सीन के तीन टारगेट के साथ-साथ एक नया टारगेट है, तो फ़्रेमवर्क createAnimator() को छह बार कॉल करता है. तीन कॉल, उन टारगेट को फ़ेड-आउट और फ़ेड-इन करते हैं जो दोनों सीन ऑब्जेक्ट में बने रहते हैं. आखिरी सीन से हटाए गए टारगेट को फ़ेड-आउट करने के लिए, दो और कॉल इस्तेमाल किए गए हैं. एक कॉल, आखिरी सीन में नए टारगेट को फ़ेड-इन करता है.

शुरुआत और आखिर में मौजूद टारगेट व्यू के लिए, फ़्रेमवर्क startValues और endValues, दोनों आर्ग्युमेंट के लिए एक TransitionValues ऑब्जेक्ट उपलब्ध कराता है. सिर्फ़ शुरुआती या आखिरी सीन में मौजूद टारगेट व्यू के लिए, फ़्रेमवर्क उससे जुड़े आर्ग्युमेंट के लिए TransitionValues ऑब्जेक्ट और दूसरे के लिए null ऑब्जेक्ट उपलब्ध कराता है.

कस्टम ट्रांज़िशन बनाते समय createAnimator(ViewGroup, TransitionValues, TransitionValues) फ़ंक्शन लागू करने के लिए, Animator ऑब्जेक्ट बनाने के लिए कैप्चर की गई व्यू प्रॉपर्टी वैल्यू का इस्तेमाल करें और उसे फ़्रेमवर्क में वापस लाएं. लागू करने का उदाहरण देखने के लिए, CustomTransition सैंपल में ChangeColor क्लास देखें. प्रॉपर्टी ऐनिमेशन के बारे में ज़्यादा जानने के लिए, प्रॉपर्टी ऐनिमेशन लेख पढ़ें.

कस्टम ट्रांज़िशन लागू करना

पसंद के मुताबिक ट्रांज़िशन, पहले से मौजूद ट्रांज़िशन की तरह ही काम करते हैं. ट्रांज़िशन लागू करना में बताए गए तरीके के मुताबिक, ट्रांज़िशन मैनेजर का इस्तेमाल करके कस्टम ट्रांज़िशन लागू किया जा सकता है.