टीएल; डीआर: मैं "जीमेल थ्री-टुकड़ा एनीमेशन" परिदृश्य के रूप में जो भी संदर्भित करूंगा उसका एक पूर्ण कार्य नमूना देख रहा हूं। विशेष रूप से, हम दो टुकड़ों से शुरू करना चाहते हैं, जैसे:
कुछ UI ईवेंट पर (जैसे, Fragment B में किसी चीज़ पर टैप करना), हम चाहते हैं:
- स्क्रीन के बाईं ओर स्लाइड करने के लिए खंड A
- स्क्रीन के बाएं किनारे पर स्लाइड करने के लिए फ्रेग्मेंट बी और फ्रैगमेंट ए द्वारा खाली किए गए स्पॉट को लेने के लिए सिकोड़ें
- Fragment C स्क्रीन के दाईं ओर से स्लाइड करने के लिए और Fragment B द्वारा खाली किए गए स्पॉट को लेने के लिए
और, BACK बटन प्रेस पर, हम चाहते हैं कि संचालन का वह सेट उलटा हो।
अब, मैंने बहुत सारे आंशिक कार्यान्वयन देखे हैं; मैं उनमें से चार की समीक्षा करूंगा। अधूरे होने के अलावा, वे सभी अपने मुद्दे हैं।
@Reto Meier ने उसी मूल प्रश्न के लिए इस लोकप्रिय उत्तर का योगदान दिया , यह दर्शाता है कि आप setCustomAnimations()
a के साथ उपयोग करेंगे FragmentTransaction
। दो-टुकड़े वाले परिदृश्य के लिए (उदाहरण के लिए, आप केवल प्रारंभ में A को देखें, और इसे एनिमेटेड प्रभावों का उपयोग करते हुए एक नए Fragment B के साथ बदलना चाहते हैं), मैं पूर्ण अनुबंध में हूं। तथापि:
- चूँकि आप केवल एक "इन" और एक "आउट" एनीमेशन निर्दिष्ट कर सकते हैं, मैं यह नहीं देख सकता कि आप तीन-टुकड़े परिदृश्य के लिए आवश्यक सभी विभिन्न एनिमेशन कैसे संभालेंगे
<objectAnimator>
अपने नमूना कोड में पिक्सल में कठिन वायर्ड पदों का उपयोग करता है, और है कि स्क्रीन आकार अलग-अलग दिया अव्यावहारिक होने लगते हैं, फिर भीsetCustomAnimations()
आवश्यकता है एनीमेशन संसाधन, जावा में इन बातों को परिभाषित करने की संभावना प्रतिबंधित- मैं के रूप में एक नुकसान में हूँ कैसे चीजें साथ में पैमाने टाई के लिए वस्तु एनिमेटरों की तरह
android:layout_weight
एक मेंLinearLayout
एक प्रतिशत के आधार पर स्थान आवंटित करने के लिए - मैं कैसे टुकड़ा सी शुरू में नियंत्रित किया जाता है के रूप में एक नुकसान में हूँ (
GONE
?android:layout_weight
की0
? 0? कुछ और पैमाने के लिए पूर्व एनिमेटेड?)
@ रोमन नुरिक बताते हैं कि आप किसी भी संपत्ति को चेतन कर सकते हैं , जिसमें आप खुद को परिभाषित करते हैं। अपने स्वयं के कस्टम लेआउट प्रबंधक उपवर्ग का आविष्कार करने की कीमत पर, हार्ड-वायर्ड पदों के मुद्दे को हल करने में मदद कर सकते हैं। यह कुछ मदद करता है, लेकिन मैं अभी भी रेटो के बाकी समाधान से चकित हूं।
इस पास्टबिन प्रविष्टि के लेखक ने कुछ टैंटलाइज़िंग स्यूडोकोड को दिखाया है, जो मूल रूप से कह रहे हैं कि सभी तीन टुकड़े शुरू में कंटेनर में निवास करेंगे, फ्रैगमेंट सी के साथ एक hide()
लेनदेन ऑपरेशन के माध्यम से शुरू में छिपा हुआ था । हम तब show()
C और hide()
A जब UI इवेंट होता है। हालाँकि, मैं यह नहीं देखता कि बी इस तथ्य को कैसे संभालता है कि बी आकार बदलता है। यह इस तथ्य पर भी निर्भर करता है कि आप जाहिरा तौर पर एक ही कंटेनर में कई टुकड़े जोड़ सकते हैं, और मुझे यकीन नहीं है कि दीर्घकालिक पर विश्वसनीय व्यवहार है या नहीं (इसका उल्लेख नहीं करना चाहिए findFragmentById()
, हालांकि मुझे उसके साथ रहना चाहिए )।
इस ब्लॉग पोस्ट के लेखक इंगित करते हैं कि जीमेल बिल्कुल उपयोग नहीं कर setCustomAnimations()
रहा है, बल्कि सीधे ऑब्जेक्ट एनिमेटरों का उपयोग करता है ("आप बस रूट के बाएं मार्जिन को बदलते हैं + सही दृश्य की चौड़ाई बदलें")। हालाँकि, यह अभी भी एक दो-टुकड़ा समाधान AFAICT है, और कार्यान्वयन को एक बार फिर से पिक्सेल में हार्ड-वायर आयाम दिखाया गया है।
मैं इस पर दूर जाना जारी रखूंगा, इसलिए मैं किसी दिन इसका जवाब देने के लिए तैयार हो सकता हूं, लेकिन मैं वास्तव में उम्मीद कर रहा हूं कि किसी ने इस एनीमेशन परिदृश्य के लिए तीन-टुकड़े समाधान का काम किया है और कोड (या एक लिंक थैरेपी) पोस्ट कर सकता है। एंड्रॉइड में एनिमेशन मुझे अपने बालों को खींचना चाहते हैं, और आपमें से जिन्होंने मुझे देखा है, उन्हें पता है कि यह काफी हद तक फलदायी प्रयास है।