Android टुकड़े और एनीमेशन


265

आपको उस तरह के स्लाइडिंग को कैसे लागू करना चाहिए जो उदाहरण के लिए हनीकॉम्ब जीमेल क्लाइंट का उपयोग करता है?

TransactionManagerफ्रैगमेंट जोड़कर और हटाकर इसे स्वचालित रूप से संभाल सकते हैं , एमुलेटर स्लाइडशो होने के कारण इसका परीक्षण करना कठिन है :)

जवाबों:


388

टुकड़ों के बीच संक्रमण को चेतन करने के लिए, या किसी टुकड़े को दिखाने या छिपाने की प्रक्रिया को चेतन Fragment Managerकरने के लिए आप एक बनाने के लिए उपयोग करते हैंFragment Transaction

प्रत्येक फ्रैगमेंट ट्रांज़ैक्शन के भीतर आप उन एनिमेशनों को निर्दिष्ट और बाहर कर सकते हैं जिनका उपयोग क्रमशः दिखाने और छिपाने के लिए किया जाएगा (या जब प्रतिस्थापन का उपयोग किया जाता है तो दोनों)।

निम्न कोड दिखाता है कि आप एक टुकड़े को कैसे हटाकर एक टुकड़े को बदल देंगे और दूसरे को उसके स्थान पर खिसका देंगे।

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

छुपा या एक टुकड़ा आप बस फोन होता दिखा साथ एक ही बात को प्राप्त करने ft.showया ft.hide, टुकड़ा में गुजर आप क्रमशः दिखाने या छिपाने करना चाहते हैं।

संदर्भ के लिए, XML एनीमेशन परिभाषाएँ objectAnimatorटैग का उपयोग करेंगी । Slide_in_left का उदाहरण कुछ इस तरह दिखाई दे सकता है:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

57
जब मैंने इसकी कोशिश की तो यह RuntimeException: अज्ञात एनिमेटर नाम: अनुवाद दिखाता है ।
लबीब पनमपुलन

3
सुनिश्चित करें कि Slide_in_left और सही में परिभाषित एनिमेशन पुराने एनीमेशन परिभाषा के बजाय ऑब्जेक्ट एनीमेटर परिभाषाओं के एक सेट का उपयोग करके बनाए गए हैं।
रीटो मीयर

7
इससे काफी मदद मिली। मैं सही रास्ते पर था, लेकिन वहाँ सब तरह से नहीं मिला। अन्य पाठकों के लिए, आपके पास Android भी हो सकती है: एक विशेषता के रूप में प्रक्षेपक, आपके पसंदीदा एक के साथ निर्दिष्ट (जैसे कि "@android: interpolator / रैखिक")। यह "@android: इंटरपोलर / acceler_decelerate" के लिए डिफ़ॉल्ट है।
डेव मैकलेन

6
मैं कॉम्पिटीशन एपीआई के साथ एपीआई स्तर 7 को लक्षित कर रहा हूं। क्या मेरे लिए एक रास्ता है कि मैं चेतन को चेतन करूं?
जारोद स्मिथ

5
@JarrodSmith आप हनीकॉम्ब एपीआई को एक्लेयर तक लाने के लिए NineOldAndroids जैसी संगतता लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं ।
श्री एस।

249

यदि आपको सहायता पुस्तकालय का उपयोग करने की आवश्यकता नहीं है, तो रोमन के उत्तर पर एक नज़र डालें ।

लेकिन अगर आप समर्थन पुस्तकालय का उपयोग करना चाहते हैं तो आपको नीचे वर्णित पुराने एनीमेशन फ्रेमवर्क का उपयोग करना होगा।

Reto's और ब्लाइंडस्टफ के उत्तरों से परामर्श करने के बाद मैंने निम्नलिखित कोड काम किया है।

टुकड़े दाएं से फिसलते हुए दिखाई देते हैं और जब वापस दबाया जाता है तो बाईं ओर फिसलते हैं।

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

आदेश महत्वपूर्ण है। इसका मतलब है कि आपको setCustomAnimations()पहले कॉल करना होगा replace()या एनीमेशन प्रभावी नहीं होगा!

इसके बाद इन फाइलों को रेस / ऐनिमेशन के अंदर रखना होगा फोल्डर के ।

enter.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

बाहर निकलें ।xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

एनिमेशन की अवधि को किसी भी डिफ़ॉल्ट मान में बदला जा सकता है जैसे कि @android:integer/config_shortAnimTimeया कोई अन्य संख्या।

ध्यान दें कि यदि खंड प्रतिस्थापन के बीच में कॉन्फ़िगरेशन परिवर्तन होता है (उदाहरण के रोटेशन के लिए) तो बैक एक्शन एनिमेटेड नहीं है। यह एक डॉक्यूमेंटेड बग है जो अभी भी सपोर्ट लाइब्रेरी के रेव 20 में मौजूद है।


47
इसने मुझे बचा लिया। ध्यान दें, आदेश पर ध्यान देना महत्वपूर्ण है , जो स्वाभाविक रूप से, मैं पहली बार याद किया। इसका अर्थ है कि आपको प्रतिस्थापित करने से पहले setCustomAnimations () को कॉल करना होगा।
स्टीफन किडसन

3
मैंने अपने अंशों पर अमल करने की कोशिश की। मैंने आपका उल्लेख करते हुए सब कुछ लिखा है, लेकिन लॉगकैट कहता है: अनजाने एनिमेटर नाम का अनुवाद मैं इस मुद्दे को कैसे दूर कर सकता हूं? वैसे मैं नेविगेशन
ड्रावर

महान काम करता है लेकिन यह बताता है कि बिल्ड टूल्स 21.1 के साथ इसे बनाने से यह कहते हुए एक त्रुटि उत्पन्न होती है कि "अमान्य फ़ाइल नाम: में केवल लोअरकेस अक्षर और अंक ([a-z0-9_]]) होना चाहिए"। मैं pop_enter.xml और pop_exit.xml के उत्तर में फ़ाइल नाम संपादित करने का सुझाव देता हूं।
स्मिचक

महान समाधान और यह महान काम करता है जब मैं बैक बटन दबाता हूं। मेरा बस एक सवाल है: अगर मैं एक कस्टम बैकबटन बनाना चाहता हूं, तो मुझे बैक बटन से व्यवहार को दोहराने के लिए किस कोड को कॉल करना चाहिए?
थॉमस टिलमैन

1
थॉमस यदि आप वापस जाना चाहते हैं, तो आपको इस फॉर्म को लागू करना चाहिए: .setCustomAnimations (R.anim.pop_enter, R.anim.pop_exit, R.anim.enter, R.anim.exit)
एलेक्स

26

मैं अत्यधिक सुझाव दूंगा कि आप एनिमेशन फ़ाइल बनाने के बजाय इसका उपयोग करें क्योंकि यह एक बेहतर समाधान है। एंड्रॉइड स्टूडियो पहले से ही डिफ़ॉल्ट प्रदान करता है जिसकाanimation उपयोग आप बिना किसी नई XML फ़ाइल बनाए कर सकते हैं। एनिमेशन के नाम android.R.anim.slide_in_left और android.R.anim.slide_out_right हैं और आप उन्हें निम्नानुसार उपयोग कर सकते हैं:

fragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

आउटपुट:

यहां छवि विवरण दर्ज करें


1
android.R ... "एंड्रॉइड स्टूडियो डिफ़ॉल्ट एनीमेशन प्रदान करता है", यह एंड्रॉइड स्टूडियो के लिए नहीं है यह ग्रहण में भी काम कर सकता है, android.R एंड्रॉइड विशिष्ट है। और जिस तरह से आपने जानकारी को साझा नहीं किया है। एंड्रॉइड पर सामान। विभिन्न एपिस पर अलग हैं।
मोरेटेज़

@stevemoretz thaxs भाई मैंने आपकी बात मान ली .. मैं अपने उत्तर को सही करूंगा और अपडेट करूंगा ...
गोवत्मान एम

5

मेरी संशोधित समर्थन लाइब्रेरी , फ़्रैगमेंट ट्रांज़िशन के लिए व्यू एनिमेशन (यानी <translate>, <rotate>) और ऑब्जेक्ट एनीमेटर (यानी <objectAnimator>) दोनों का उपयोग करती है । इसे NineOldAndroids के साथ लागू किया गया है । विवरण के लिए github पर मेरे दस्तावेज़ देखें।


2

मेरे लिए, मुझे देखने की आवश्यकता है:

में -> दाईं ओर से स्वाइप करें

बाहर -> बाईं ओर स्वाइप करें

यहाँ मेरे लिए काम करता है कोड:

slide_in_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
                android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
                android:duration="@android:integer/config_mediumAnimTime" />
    </set>

लेनदेन कोड:

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}

एंड्रॉइड उन एनिमेशन (विशेष रूप से अनुवाद वाले) के साथ बदलावों की
झड़ी लगाता

@GabrielDeOliveiraRohden के रूप में मेरे लिए सभी casses में नहीं
सर्ग

1

मैं नीचे इस तरह से हल

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.