टुकड़ों के बीच संक्रमण चेतन


284

मैं टुकड़ों के बीच संक्रमण को चेतन करने की कोशिश कर रहा हूं। मुझे निम्नलिखित Android Fragments और एनीमेशन से जवाब मिला

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();

और मेरा R.anim.slide_in_left

<?xml version="1.0" encoding="utf-8"?>
<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>

लेकिन जब मैंने यह कोशिश की तो यह दिखा

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

कोई विचार? जब मैंने चेक किया तो हनीकॉम्ब एपीआई संदर्भ translateहै। मुझसे क्या छूट गया?
क्या टुकड़ों के बीच संक्रमण को चेतन करने का कोई अन्य तरीका है? धन्यवाद


एनिमेटर का उपयोग करें --- एनिमेशन नहीं! android.R.ANIMATOR.fade_in कार्यों का उपयोग करें, Android का उपयोग न करें।
RAN.fade_in

जवाबों:


347

आप नए उपयोग करने की आवश्यकता android.animationके साथ ढांचे (वस्तु एनिमेटरों) FragmentTransaction.setCustomAnimationsके साथ-साथ FragmentTransaction.setTransition

यहाँ setCustomAnimationsApiDemos ' FragmentHideShow.java से उपयोग करने पर एक उदाहरण है :

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

और यहाँ res / animator / fade_in.xml से प्रासंगिक एनिमेटर XML है :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_quad"
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:duration="@android:integer/config_mediumAnimTime" />

ध्यान दें कि आप कई एनिमेटरों का उपयोग करके संयोजन कर सकते हैं <set>, जैसे कि आप पुराने एनीमेशन फ्रेमवर्क के साथ कर सकते हैं।


संपादित करें : चूंकि लोग स्लाइड-इन / स्लाइड-आउट के बारे में पूछ रहे हैं, मैं यहां उस पर टिप्पणी करूंगा।

स्लाइड-इन और स्लाइड-आउट

आप निश्चित रूप से चेतन कर सकते हैं translationX, translationY, x, और yगुण है, लेकिन आम तौर पर स्लाइड करने के लिए और ऑफ स्क्रीन से सामग्री एनिमेट शामिल है। जहां तक ​​मुझे पता है कि कोई भी संक्रमण गुण नहीं हैं जो सापेक्ष मूल्यों का उपयोग करते हैं। हालाँकि, यह आपको उन्हें स्वयं लिखने से नहीं रोकता है। याद रखें कि संपत्ति के एनिमेशन के लिए बस उन ऑब्जेक्ट्स पर गेट्टर और सेटर विधियों की आवश्यकता होती है जिन्हें आप एनिमेट कर रहे हैं (इस मामले के विचारों में), इसलिए आप इस तरह से अपने व्यू सबक्लास पर अपना खुद का getXFraction और setXFractionतरीके बना सकते हैं :

public class MyFrameLayout extends FrameLayout {
    ...
    public float getXFraction() {
        return getX() / getWidth(); // TODO: guard divide-by-zero
    }

    public void setXFraction(float xFraction) {
        // TODO: cache width
        final int width = getWidth();
        setX((width > 0) ? (xFraction * width) : -9999);
    }
    ...
}

अब आप इस तरह से 'xFraction' प्रॉपर्टी को एनिमेट कर सकते हैं:

रेस / एनिमेटर / स्लाइड_इन.एक्सएमएल :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="-1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

ध्यान दें कि यदि आप जिस वस्तु में एनिमेट कर रहे हैं, वह उसके माता-पिता की तरह चौड़ाई नहीं है, तो चीजें काफी हद तक सही नहीं लगेंगी, इसलिए आपको अपने उपयोग के मामले को सूट करने के लिए अपनी संपत्ति के कार्यान्वयन को मोड़ने की आवश्यकता हो सकती है।


8
मुझे काम करने के लिए fade_in और fade_out मिला, लेकिन अन्य लोग / res / animator त्रुटियाँ देते हैं। और उनमें से कोई भी अंदर और बाहर खिसकने के लिए दिखाई नहीं देता है। मैंने ऐसा करने के लिए अपनी खुद की xml लिखने की कोशिश की है, लेकिन मैं अंत में टुकड़ों के शीर्ष पर टुकड़े कर रहा हूं। कृपया कुछ और मदद करें?
डेव मैकलेन

और अनुवाद के बारे में क्या? आप XML में एक ऑब्जेक्टएनिमेटर डिफरेंशियल में प्रतिशत के मान के साथ अनुवाद कैसे करते हैं? मैं चेतन अनुकूलक में सफल नहीं हुआ, ऊर्ध्वाधर स्लाइड एनिमेशन के साथ xml में परिभाषित करने के दौरान फ्लिपिंग ...
GBouerat

6
मुझे 11-19 10: 27: 50.912: W / PropertyValuesHolder (23107) मिल रहा है: विधि setXFraction () प्रकार फ़्लोट के साथ लक्षित वर्ग android.widget.FrameLayout पर नहीं मिला। लेकिन मेरे XML में मेरा कस्टम दृश्य MyFrameLayout है। कोई विचार?
बर्कसाइड

13
वास्तव में, रोमन, सलाह को दूसरे तरीके से भी जाना चाहिए: समर्थन लाइब्रेरी का उपयोग करते समय, आपको FragmentTransaction.setCustomAnimations ao
pjv

1
@RomanNurik ने इस उत्तर पर अधिकांश उपकरणों पर काम किया, लेकिन कुछ उपयोगकर्ताओं के लिए (विशेष रूप से कुछ सैमसंग गैलेक्सी S3 / 4 फोन पर) किसी कारण से एनिमेशन के दौरान चौड़ाई रिपोर्ट नहीं हो रही थी, जिसके कारण यह टुकड़ा कभी प्रकट नहीं हुआ। मैं इसे उन उपयोगकर्ताओं के लिए काम कर पा रहा था जो यहाँ दिखाए गए अनुसार OnPredrawListener का उपयोग कर रहे हैं: mavyasoni9891.blogspot.com/2014/06/…
ajpolt

188

मैंने इस तरह किया है:

एनिमेशन के साथ टुकड़ों को बदलने के लिए इस विधि को जोड़ें :

public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left);
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(tag);
    transaction.commit();
}

आप के लिए है जोड़ने के चार एनिमेशन में anim जो फ़ोल्डर सहयोगी के साथ संसाधन :

enter_from_left.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

exit_to_right.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

enter_from_right.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

exit_to_left.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="-100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

आउटपुट:

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

इसका काम किया


14
महान समाधान। हालांकि मैं अनिश्चित हूं कि आपने आरटीएल को निर्देश क्यों दिए। मेरे विधि:.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
जेड

2
बहुत बढ़िया समाधान। समान दृष्टिकोण और समान एनीमेशन फाइलें गतिविधियों के बीच संक्रमण के लिए काम करती हैं।
स्टेन

1
@ मायकेज्रील, रेस -> एनिमेशन -> अपना xml यहां डालें
हिरेन पटेल

3
धन्यवाद हिरेन, मैं गति (700) से (300) को आईओएस की तरह बेहतर और अधिक
बदलता हूं

3
LOL, मैं समाधान के साथ वापस आया। मैं प्रत्येक जावा वर्ग पर android.app.fragment और FragmentManager आयात कर रहा था। कुछ सामग्रियों की जाँच करने के बाद, मैंने पाया है कि 'setCustomAnimations ()' का उपयोग करने के लिए android.support.v4 लाइब्रेरी को आयात करने की आवश्यकता है। यह कहना महत्वपूर्ण है कि 'support.v4.app' होना चाहिए! मैंने 'getSupportFragmentManager ()', और सभी आयात 'android.app.Fragment / FragmentManager ...' के साथ 'getFragmentManager ()' को 'android.support.v4.app ....' में बदल दिया। एनीमेशन दुर्घटना के बिना अच्छी तरह से काम करना शुरू कर दिया ... यदि आप लोग इसी तरह के मामलों में फंस गए हैं, तो मेरा समाधान पढ़ें। Thx Hiren Patel xD
कोरियाईएक्सकोडवर्कर

58

यदि आप अपने आप को सिर्फ लॉलीपॉप और बाद में बाँध सकते हैं, तो ऐसा लगता है:

import android.transition.Slide;
import android.util.Log;
import android.view.Gravity;
.
.
.
f = new MyFragment();
f.setEnterTransition(new Slide(Gravity.RIGHT));
f.setExitTransition(new Slide(Gravity.LEFT));
getFragmentManager()
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

उम्मीद है की यह मदद करेगा।


1
हालांकि यह लॉलीपॉप पर हासिल करेगा, यह शायद ही व्यावहारिक है क्योंकि लॉलीपॉप चलाने वाले डिवाइस का प्रतिशत नगण्य है (वर्तमान में 1.6% एंड्रॉइड डिवाइस लॉलीपॉप चला रहे हैं)।
एरन गोल्डिन

1
new Slide(...): कॉल के लिए एपीआई स्तर 21 की आवश्यकता होती है
चिंतन सोनी

क्या मिलता है?
अल्वारो

13
@ EranGoldin कुछ भी नहीं हमेशा के लिए रहता है .. क्या आप आज Android 2.0+ केवल समाधान पर उपहास करेंगे?
टॉम

@ आप एक बिंदु है। हालाँकि, जब आपके ऐप में एक बड़ा उपयोगकर्ता आधार है, तो आप एपीआई स्तर को टक्कर नहीं दे सकते। यदि आपके अधिकांश उपयोगकर्ता आपके ऐप को अब और नहीं चला पाएंगे, तो इसका कोई हल नहीं है।
एरन गोल्डिन

47

Nurik के जवाब बहुत मददगार था, लेकिन मैं जब तक मैंने पाया काम करने के लिए यह नहीं मिल सका इस । संक्षेप में, यदि आप संगतता पुस्तकालय (जैसे कि FragmentManager के बजाय SupportFragmentManager) का उपयोग कर रहे हैं, XML एनीमेशन फ़ाइलों का सिंटैक्स अलग होगा।


28

यहाँ टुकड़े के बीच में / बाहर एनीमेशन स्लाइड है:

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.listFragment, new YourFragment());
transaction.commit();

हम एक ऑब्जेक्टनीमेटर का उपयोग कर रहे हैं।

यहाँ एनिमेटर सबफ़ोल्डर में दो xml फाइलें हैं ।

enter_anim.xml

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

exit_anim.xml

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

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।


37
2000 पीएक्स के लिए दृश्य को स्थानांतरित करना, एक बहुत ही बदसूरत समाधान है।
carlo.marinangeli

4
मेरे लिए एग्जिट_मैंन स्क्रीन से "पॉप" होता है, यह स्क्रीन पर वापस चेतन नहीं करता है। कोई विचार? मैं का उपयोग कर रहा हूँ.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
श्री पाब्लो

@MrPablo, कारण शायद यह है कि आपने ऊपर दिए गए कोड को कॉपी नहीं किया है। setCustomAnimations को प्रतिस्थापित विधि से पहले बुलाया जाना चाहिए।
गैल्या

इस स्थिति में, यदि मैं अन्य टुकड़े को एनीमेशन से बदल देता हूं और मैं एनीमेशन टाइम-आउट या अवधि खत्म होने से पहले एप्लिकेशन को कम से कम करता हूं और फिर से एप्लिकेशन पर वापस आता हूं, तो यह पिछले टुकड़े और वर्तमान टुकड़े को समानांतर प्रदर्शित करेगा।
प्रिंस

23

किसी और के लिए जो पकड़ा जाता है, यह सुनिश्चित करें कि लेनदेन का निर्माण करते समय बदलने / जोड़ने के लिए कॉल करने से पहले setCustomAnimations कहा जाता है।


12

FragmentTransaction का Android SDK कार्यान्वयन कुछ Animatorसमय के लिए समर्थन लाइब्रेरी चाहता है Animation, मुझसे यह क्यों न पूछें, लेकिन अजनबियों की टिप्पणी के बाद मैंने android 4.0.3 कोड और समर्थन पुस्तकालय में देखा। एंड्रॉइड एसडीके loadAnimator()पुस्तकालय का उपयोग करता है और समर्थन करता हैloadAnimation()


7

इस सरल और उपवास समाधान का उपयोग करने का प्रयास करें। Android कुछ डिफ़ॉल्ट animationएस प्रदान करता है ।

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();

आउटपुट:

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


वाह .. यह स्वीकृत उत्तर होना चाहिए !! एक सरल और सुरुचिपूर्ण समाधान। अन्य
सुझावों
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.