2013-04-08 8 views
40

मेरे पास लेआउट का ग्रिड व्यू है जिसे ग्रिड में गतिशील रूप से जोड़ा या हटाया जा सकता है।एंड्रॉइड: ग्रिड व्यू सामग्री में परिवर्तनों को एनिमेट करना

आईओएस में, ग्रिड व्यू आइटम के लिए मूल व्यवहार ग्रिड में अन्य वस्तुओं के लिए हटाए गए आइटम की जगह में स्लाइड करने के लिए है, या जब कोई नया आइटम जोड़ा जाता है तो कमरे बनाने के लिए स्लाइड करें।

हालांकि एंड्रॉइड पर व्यवहार केवल स्क्रीन पर तुरंत पॉप में बदलाव के लिए है। मैं हर getView() कॉल GridView के अनुकूलक में कुछ चाल का उपयोग कर के लिए कस्टम एनिमेशन जोड़ने की कोशिश की, लेकिन वह के कारण कुछ समस्या यहाँ देखा समाप्त हो गया:

Android GridView loading the 0 indexed item in a later index's slot when data set changes

मैं अलग-अलग दृश्यों के बजाय एनीमेशन को नियंत्रित होने की कोशिश की एडाप्टर की getView() विधि, लेकिन अंतिम परिणाम समान था।

मैं भी एक GridLayoutAnimationController उपयोग करते हुए, इस तरह की कोशिश की:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein); 
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f); 
mGrid.setLayoutAnimation(controller); 

यह सब GridView सामग्री के प्रारंभिक लोड पर काम करता है, लेकिन उस सामग्री में कोई परिवर्तन सिर्फ तुरन्त में पॉप की तरह यह डिफ़ॉल्ट रूप से करता है।

मुझे लगता है कि यह एक बहुत ही सरल विशेषता है, और इसे करने का एक आसान तरीका होना चाहिए। सबसे अच्छा मैंने ऑनलाइन खोज से देखा है a library जो ग्रिडव्यू आइटम को ग्रिड में स्थानांतरित करता है जो ग्रिडव्यू आइटम को एनिमेट करता है, लेकिन यह वही नहीं है जो मैं ढूंढ रहा हूं (उसी लाइब्रेरी में, जब आप ग्रिड से किसी आइटम को हटाने के माध्यम से हटाते हैं, एक ही तत्काल प्रभाव जो मैं बचने की कोशिश कर रहा हूं)।

एसओ पर एक आम जवाब मैंने यह भी देखा है "एपिडेमोस को देखो, कई उदाहरण हैं।" लेकिन जहां तक ​​मैं देख सकता हूं, वास्तव में ग्रिड व्यू सामग्री परिवर्तनों को एनिमेट करने के लिए कोई उदाहरण नहीं हैं।

किसी भी मदद की सराहना की है, धन्यवाद।

+1

आप किस प्रकार के एनिमेशन जोड़ना चाहते हैं? एक्सएमएल प्रॉपर्टी को जोड़ना "एनिमेटलाउट चेंज = सच्चाई" किसी भी दृश्य के लिए कुछ बुनियादी द्रव एनिमेशन प्रदान करेगा। – klmprt

+1

यह पहली बात है जिसकी मैंने कोशिश की, और यह दुर्भाग्य से काम नहीं करता है। – JMRboosties

+0

मई, मुझे पता है कि इस एनीमेशन को कैसे रोकें। –

उत्तर

7

चेट हास ListView एनिमेशन को ठीक तरह से संभालने के तरीके पर एक अच्छा वीडियो के साथ बाहर आया। मूल अवधारणा को ग्रिड व्यू पर लागू किया जा सकता है। आप वीडियो here देख सकते हैं।

यदि आप एपीआई 1.0+ के लिए विकसित कर रहे हैं, तो आप वीडियो संदर्भ (जैसे ViewPropertyAnimator) संदर्भित एनीमेशन सुविधाओं का उपयोग करने में सक्षम नहीं होंगे जब तक कि आप NineOldAndroids का उपयोग न करें।

2

मैं इस संसाधन लिंक काफी ऐसे LinearLayout आदि .: http://developer.android.com/training/animation/layout.html के रूप में अन्य लेआउट विचारों के लिए एनीमेशन के साथ काम उम्मीद है कि इस मदद कर सकते हैं के लिए उपयोगी पाया है। प्रेरणा

4

के लिए आप https://github.com/nhaarman/ListViewAnimations पर भी देख सकते हैं, मुझे एडाप्टर व्यू के लिए लगता है, व्यू ग्रुप का लेआउट ट्रान्सशन काम नहीं करेगा। स्रोत कोड को देखते हुए, व्यू ग्रुप सुनिश्चित करता है कि अन्य बच्चों के संक्रमण एनिमेशन addView और removeView पर कॉल के लिए होते हैं, लेकिन व्युत्पन्न एडाप्टर व्यू उन तरीकों का उपयोग नहीं करता है, क्योंकि यह विचारों की आपूर्ति के लिए एडाप्टर पर निर्भर करता है।

ऊपर वर्णित चेत हास का वीडियो एक सूची दृश्य के एक बच्चे के दृश्य को एनिमेट करने के बारे में है जो गायब होने के लिए आगे बढ़ने वाले सभी अन्य आसपास के बच्चों के विचारों को एनिमेट करने के बजाए गायब हो रहा है।

और, यदि मैं इसे सही समझ रहा हूं, तो ग्रिडलाउट एनीमेशन कंट्रोलर बच्चों के लिए भयानक एनिमेशन के बारे में है (यानी पहली बार या पूरी सूची का पूरा रिलाउट, खाली से शुरू होता है), बजाय एनिमेट करने के बजाय- जोड़ने या निकालने के बाद आसपास के बच्चों के लेआउट परिवर्तन रखें। इसलिए, बच्चों को लुप्तप्राय या फिसलने या कताई में दिखाई देते हैं - हमेशा एक समय में, पहले से आखिरी तक।

अंत में, एक सुझाया गया समाधान: यदि आपको एडाप्टर-आधारित दृश्य की आवश्यकता नहीं है, तो आप ग्रिडलाउट या लीनियरलाउट पर स्विच कर सकते हैं। यही वह जगह है जहां animateLayoutChanges="true" काम करेगा, और 'लेआउट एनीमेशन' डेमो हमेशा क्या उपयोग करेगा। नोट लेआउट ट्रांसमिशन के लिए न्यूनतम एपीआई स्तर 11 की आवश्यकता होती है और ग्रिडलाउट को api14 की आवश्यकता होती है।

4

GridView जैसे .remove() में कोई भी परिवर्तन करने के बाद आपको mGrid.startLayoutAnimation() पर कॉल करना होगा;

ग्रिड व्यू स्वचालित रूप से आपके लिए नहीं करेगा। आपको इसे मैन्युअल रूप से ट्रिगर करना होगा ;-)

संबंधित मुद्दे