2012-03-16 17 views
10

पर एनीमेशन जोड़ें क्या एंड्रॉइड में विस्तारणीय सूची खोलते समय एनीमेशन जोड़ने का कोई तरीका है? मुझे यह चाहिए कि जब उपयोगकर्ता विस्तारणीय सूची पर क्लिक करता है, तो इसमें एक एनीमेशन/प्रभाव होता है जैसे कि मैं एक स्लाइडिंग ड्रॉवर खोल रहा हूं।एक विस्तारणीय लिस्ट व्यू

यह पूरी तरह से खोले जाने तक धीमी गति से चलता है।

+0

[http://stackoverflow.com/a/5582924/420015 ](httpoverflow.com/a/5582924/420015) – adneal

उत्तर

1

तो मैंने जो किया है वह नियमित ListView का उपयोग करता है और फिर एनीमेशन कोListItemClick में निष्पादित करता है। एनीमेशन इस लिंक पर मैं जो करता हूं उसके समान है: Android animate drop down/up view proper

लेकिन केवल पंक्ति दृश्य के एक हिस्से के लिए। पंक्ति दृश्य xml:

<somelayout> 
    <normal> 
    </normal> 
    <expanded> 
    </expanded> 
</somelayout> 

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

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

+0

यह एक सूची दृश्य का विस्तार करने के लिए है, विस्तारित लिस्ट व्यू – havchr

+1

में किसी समूह का विस्तार करने के लिए नहीं @havchr सही है, लेकिन कभी-कभी विस्तारित आइटम की सामग्री को नियमित आइटम के अंदर रखा जा सकता है और इस समाधान का उपयोग किया जा सकता है। – Warpzit

2

मैं इस एक ही सटीक समस्या थी। और मैंने इसे एक बार और सभी के लिए तय किया। मैंने इसे गिटूब में खोल दिया। https://github.com/tjerkw/Android-SlideExpandableListView

असल में, आप अपने एंड्रॉइड प्रोजेक्ट के साथ इस परियोजना निर्भरता को शामिल करते हैं। और उसके बाद ListAdapter को SlideExpandableListAdapter पर लपेटें। तब रैपर आपके ListView पर एनीमेशन के साथ स्लाइड कार्यक्षमता जोड़ देगा।

आशा है कि यह आपकी मदद करे, मैं पहले से ही दो परियोजनाओं में इसका उपयोग कर रहा हूं।

+0

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

+0

@KentAndersen वास्तव में एक पुल अनुरोध पहले से ही स्वीकार कर लिया गया था जो इस मुद्दे को ठीक करना चाहिए। क्या आप नवीनतम संस्करण का उपयोग कर रहे हैं? यदि आपको अभी भी समस्याएं हैं तो कृपया इसे एक गिथब टिकट में विस्तार से समझाएं। – TjerkW

+0

लेकिन आपने ExpandableListView का उपयोग नहीं किया है। मैं विस्तारणीय सूची दृश्य के बाल दृश्यों को एनिमेट करना चाहता हूं, सूची दृश्य नहीं। – anshul

4

मैंने भाग्य के साथ बहुत समय बिताया है। मौजूदा समाधान पर्याप्त चिकनी नहीं हैं - यदि आपका लेआउट केवल 2 बटनों की तुलना में कुछ जटिल है, तो यह कमजोर हो जाता है।

इसलिए, मैंने अपना खुद का ListAdapter बनाया है जो पूरे दृश्य को Bitmap में कैश करता है और फिर दृश्य के बजाय कैश किए गए दृश्य पर एनीमेशन निष्पादित करता है। यह बहुत तेजी से काम करता है।

यहाँ

यह है: https://github.com/dmitry-zaitsev/ExpandableAdapter

अच्छी खबर यह है कि आप कोड का एक समूह को फिर से लिखने की जरूरत नहीं है है - बस अपने एडाप्टर के आसपास मेरी ExpandableAdapter लपेट कर देखने की आईडी है कि एक टॉगल की तरह कार्य करेगा प्रदान करते हैं बटन और दृश्य की आईडी जो दूसरे स्तर की सामग्री रखती है:

new ExpandableAdapter(context, yourAdapter, R.id.switch, R.id.holder); 

और यह सब कुछ है।

+0

में एक समूह का विस्तार करने के लिए नहीं, अच्छा समाधान है, लेकिन यह एक सूची दृश्य के लिए है, न कि विस्तारणीय लिस्ट व्यू के बारे में पूछे जाने वाले पोस्टर की तरह। – havchr

+0

@havchr 'ExpandableListView' मूल रूप से बेकार है (अनुकूलन क्षमताओं की कमी के कारण), इसलिए इस समाधान का उद्देश्य' ListView' + 'ExpandableAdapter' के समूह के साथ' ExpandableListView' को प्रतिस्थापित करना है। –

+0

आर.आईडी.होल्डर क्या है? मुझे क्या पारित करना चाहिए? धन्यवाद –

0

यही मैंने इस परिस्थितियों में किया था।

ObjectAnimator ObjectAnimator = ObjectAnimator.ofPropertyValuesHolder (List1, PropertyValuesHolder.ofInt ("नीचे", currentlistHeight, currentlistHeight * 2));

यह क्या करना होगा कि ListView की ऊंचाई दोगुनी हो जाएगी और यह एनिमेटेड होगा। यदि आप वर्तमान सूची ऊंचाई शून्य सेट करते हैं। यह एक दराज की तरह कार्य करेगा।

2

मैंने इस काम को भी करने की कोशिश की है। मुझे एक समाधान मिला है जो बच्चे के दृश्यों के लिए काम करता है। यह समूह के वास्तविक विस्तार को एनिमेट नहीं करता है, लेकिन बच्चे की कोशिकाओं को एनिमेट करता है क्योंकि वे विस्तार को छोड़कर अंतरिक्ष को भरते हैं।

संपादित करें: ढहने में एक बग है, जो कुछ कोशिकाओं को छिपाएगा जो छुपा नहीं होना चाहिए, छुपाएं। यह शायद सूची दृश्य में व्यू-रीसाइक्लिंग से संबंधित है। जब मैं इसका समाधान करता हूं तो मैं अपडेट करूंगा।

setOnGroupClickListener में layoutAnimation साथ एनिमेट

 mResultList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
     @Override 
     public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
      if(mResultList.isGroupExpanded(groupPosition)){ 
       mProgAdap.prepareToCollapseGroup(groupPosition); 
       setupLayoutAnimationClose(groupPosition); 
       mResultList.requestLayout(); 
      }else{ 
       boolean autoScrollToExpandedGroup = false; 
       mResultList.expandGroup(groupPosition,autoScrollToExpandedGroup); 
       setupLayoutAnimation(); 
       //*/ 
      } 
      //telling the listView we have handled the group click, and don't want the default actions. 
      return true; 
     } 

     private void setupLayoutAnimation() { 
      AnimationSet set = new AnimationSet(true); 
      Animation animation = new AlphaAnimation(0.0f, 1.0f); 
      animation.setDuration(50); 
      set.addAnimation(animation); 

      animation = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f, 0.5f, 1.0f); 
      animation.setDuration(50); 
      set.addAnimation(animation); 

      LayoutAnimationController controller = new LayoutAnimationController(set, 0.75f); 
      mResultList.setLayoutAnimationListener(null); 
      mResultList.setLayoutAnimation(controller); 
     } 

     private void setupLayoutAnimationClose(final int groupPosition) { 
      AnimationSet set = new AnimationSet(true); 
      Animation animation = new AlphaAnimation(1.0f, 0.0f); 
      animation.setDuration(50); 
      animation.setFillAfter(true); 
      animation.setFillEnabled(true); 
      set.addAnimation(animation); 
      animation = new ScaleAnimation(1.0f, 1.0f, 1.0f, 0.0f, 0.5f, 0.0f); 
      animation.setDuration(50); 
      animation.setFillAfter(true); 
      animation.setFillEnabled(true); 
      set.addAnimation(animation); 
      set.setFillAfter(true); 
      set.setFillEnabled(true); 
      LayoutAnimationController controller = new LayoutAnimationController(set, 0.75f); 
      controller.setOrder(LayoutAnimationController.ORDER_REVERSE); 
      mResultList.setLayoutAnimationListener(new Animation.AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        mResultList.collapseGroup(groupPosition); 
       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 

       } 
      }); 
      mResultList.setLayoutAnimation(controller); 
     } 
    }); 

हम और अधिक में तोड़ मरोड़ जरूरत एनीमेशन केवल विस्तार/ढह समूह की वास्तविक बच्चों के लिए लागू करने के लिए। चूंकि हम लेआउटएनिमेशन कंट्रोलर में सही भाग को अधिभारित नहीं कर सकते हैं, इसलिए हमें एक विशेष व्यू ग्रुप क्लास बनाने की आवश्यकता है। यह वही तकनीक है, "Can LayoutAnimationController animate only specified Views"

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

@Override 
public void onGroupExpanded(int groupPos){ 
    super.onGroupExpanded(groupPos); 

    int childCount = getChildrenCount(groupPos); 
    Log.d("EXPLIST","setting children to be expanded:" + childCount); 

    for(int j=0; j < getGroupCount(); j++){ 
     for(int k=0; k < getChildrenCount(j); k++){ 
      GoalServiceCell cell = (GoalServiceCell)getChild(j,k); 
      cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; 
     } 
    } 

    for(int i=0; i < childCount; i++){ 
     GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); 
     cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_START_EXPAND; 

    } 

} 

public void prepareToCollapseGroup(int groupPos){ 
    int childCount = getChildrenCount(groupPos); 
    for(int j=0; j < getGroupCount(); j++){ 
     for(int k=0; k < getChildrenCount(j); k++){ 
      GoalServiceCell cell = (GoalServiceCell)getChild(j,k); 
      cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; 
     } 
    } 

    for(int i=0; i < childCount; i++){ 
     GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); 
     cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_START_COLLAPSIN; 

    } 
} 

@Override 
public void onGroupCollapsed(int groupPos){ 
    super.onGroupCollapsed(groupPos); 
    int childCount = getChildrenCount(groupPos); 
    for(int i=0; i < childCount; i++){ 
     GoalServiceCell cell = (GoalServiceCell)getChild(groupPos,i); 
     cell.expandAnimState = GoalServiceCell.ExpandAnimState.SHOULD_NOT_ANIMATE; 
    } 

} 

और बच्चों के व्यूहोल्डर में।

 void expandOrCollapse(GoalServiceCell cell,int position){ 

     AnimationAverseRelativeLayout hack = (AnimationAverseRelativeLayout)master; 
     boolean shouldAnim = cell.expandAnimState == GoalServiceCell.ExpandAnimState.SHOULD_START_EXPAND || 
          cell.expandAnimState == GoalServiceCell.ExpandAnimState.SHOULD_START_COLLAPSIN; 
     hack.setIfShouldAnimate(shouldAnim); 

    } 

ग्रुप व्यू एनीमेशनअर्सरेलिएटिव लयआउट में भी निहित हैं। चूंकि मैंने डिफ़ॉल्ट रूप से "चाहिएअनुमेट" सेट किया है, इसलिए मुझे उन्हें छूने की आवश्यकता नहीं है।

+0

बिल्कुल काम नहीं कर रहा ...... कुछ अजीब गुंड व्यवहार दिखा रहा है। –

+0

मुझे "पतन" एनीमेशन अक्षम करना पड़ा, क्योंकि मुझे इसे कभी काम नहीं मिला।क्या यह गुस्से में है जब आप केवल विस्तार एनीमेशन कर रहे हैं? – havchr

+0

हाँ ... कुछ यादृच्छिक आंदोलन ... –

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