आपको उस तरह के स्लाइडिंग को कैसे लागू करना चाहिए जो उदाहरण के लिए हनीकॉम्ब जीमेल क्लाइंट का उपयोग करता है?
TransactionManager
फ्रैगमेंट जोड़कर और हटाकर इसे स्वचालित रूप से संभाल सकते हैं , एमुलेटर स्लाइडशो होने के कारण इसका परीक्षण करना कठिन है :)
आपको उस तरह के स्लाइडिंग को कैसे लागू करना चाहिए जो उदाहरण के लिए हनीकॉम्ब जीमेल क्लाइंट का उपयोग करता है?
TransactionManager
फ्रैगमेंट जोड़कर और हटाकर इसे स्वचालित रूप से संभाल सकते हैं , एमुलेटर स्लाइडशो होने के कारण इसका परीक्षण करना कठिन है :)
जवाबों:
टुकड़ों के बीच संक्रमण को चेतन करने के लिए, या किसी टुकड़े को दिखाने या छिपाने की प्रक्रिया को चेतन 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>
यदि आपको सहायता पुस्तकालय का उपयोग करने की आवश्यकता नहीं है, तो रोमन के उत्तर पर एक नज़र डालें ।
लेकिन अगर आप समर्थन पुस्तकालय का उपयोग करना चाहते हैं तो आपको नीचे वर्णित पुराने एनीमेशन फ्रेमवर्क का उपयोग करना होगा।
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 में मौजूद है।
मैं अत्यधिक सुझाव दूंगा कि आप एनिमेशन फ़ाइल बनाने के बजाय इसका उपयोग करें क्योंकि यह एक बेहतर समाधान है। एंड्रॉइड स्टूडियो पहले से ही डिफ़ॉल्ट प्रदान करता है जिसका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();
आउटपुट:
मेरी संशोधित समर्थन लाइब्रेरी , फ़्रैगमेंट ट्रांज़िशन के लिए व्यू एनिमेशन (यानी <translate>, <rotate>
) और ऑब्जेक्ट एनीमेटर (यानी <objectAnimator>
) दोनों का उपयोग करती है । इसे NineOldAndroids के साथ लागू किया गया है । विवरण के लिए github पर मेरे दस्तावेज़ देखें।
मेरे लिए, मुझे देखने की आवश्यकता है:
में -> दाईं ओर से स्वाइप करें
बाहर -> बाईं ओर स्वाइप करें
यहाँ मेरे लिए काम करता है कोड:
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()
}
}
}
}
मैं नीचे इस तरह से हल
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment