2012-08-13 8 views
22

के साथ लीनियरलायआउट कंटेनर की ऊंचाई का एनीमेशन मेरे पास एक लाइनरलाइट है जो मैं कुछ बटन और टेक्स्टव्यू के लिए एक कंटेनर के रूप में उपयोग करता हूं कि मैं लेआउट के इंप्रेशन को देने के लिए ऊंचाई को एनिमेट करना चाहता हूं जब उपयोगकर्ता " दिखाएं "बटन।ValueAnimator

मैंने लाइनरलाइट को layout_height = "0dp" और दृश्यता = "चला गया" मेरे xml में सेट किया है। मैं फिर इसे दिखाना चाहता हूं और सामग्री को लपेटने के लिए जो भी ऊंचाई की आवश्यकता है। फिलहाल मुझे इसे एनिमेट करने में भी समस्याएं आ रही हैं, लपेटें सामग्री की ऊंचाई को कभी भी न मानें।

यहाँ animating के लिए मेरे विधि है:

private void toggle(final LinearLayout v) { 
    v.setVisibility(View.VISIBLE); 
    ValueAnimator va = ValueAnimator.ofInt(0, 300); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.invalidate(); 

     } 
    }); 

    va.start(); 
} 

शायद समस्या मैं कैसे LinearLayout की ऊंचाई की स्थापना कर रहा हूँ? या क्या मैं ValueAnimator के फ़ंक्शन को गलत समझ रहा हूं? मैंने चेट हास द्वारा ब्लॉग पोस्ट पर चारों ओर देखा है लेकिन उनमें कोई विशिष्ट ऊंचाई एनीमेशन उदाहरण नहीं हैं। मैं भी 3.0+ से एपीआई का उपयोग कर ऊंचाई के एनिमेशन के साथ काम करने के तरीके के बारे में और अच्छे उदाहरण खोजने में सक्षम हूं। इस पर कुछ मदद चाहिए, धन्यवाद!

+0

क्यों लेआउट एनीमेशन का उपयोग न करें? –

+0

सचमुच मुझे इसका उपयोग करने के बारे में कोई जानकारी नहीं है और मुझे लगा कि चूंकि मैं केवल एपीआई के नए संस्करणों को लक्षित कर रहा हूं, इसलिए नए वर्गों का उपयोग करना आसान होगा ... मैं लेआउटएनीमेशन के साथ इसे कैसे करना चाहता हूं, अगर आपको यह पता है कि इसे कैसे किया जाए तो इसे बेहतर समाधान के रूप में पोस्ट करने में संकोच न करें :) – span

+0

क्या अमान्य करने का कोई कारण है? – portfoliobuilder

उत्तर

57

इस ब्लॉग पोस्ट को देखकर: http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/ मुझे पता चला कि लेआउट को फिर से खींचा जाने के लिए मुझे view.invalidate() का उपयोग नहीं करना चाहिए। मुझे view.requestLayout() का उपयोग करना चाहिए।

ValueAnimator va = ValueAnimator.ofInt(0, height); 
    va.setDuration(700); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.requestLayout(); 
     } 
    }); 

मैं सिर्फ कैसे LinearLayout की ऊंचाई प्राप्त करने के साथ-साथ एनीमेशन गतिशील बनाने के लिए पर एक नोट जोड़ना चाहते थे:

इस प्रकार कोड कुछ इस तरह हो जाता है। ऊंचाई प्राप्त करने के लिए सभी विचारों को पहले खींचा जाना चाहिए। इसके लिए हमें एक ऐसी घटना सुननी है जो हमें बताती है कि चित्रण किया गया है। यह इस तरह से ऑन्यूज़() विधि से किया जा सकता है (ध्यान दें कि मेरे एक्सएमएल में मैंने कंटेनर को ऊंचाई के लिए wrap_content घोषित कर दिया है और यह भी दिखाई देता है, क्योंकि मैं इसे शुरुआत से छिपाना चाहता हूं, मैं इसे मापने वाला efter करता हूं):

@Override 
    public void onResume() { 
     super.onResume(); 
     final ViewTreeObserver vto = filterContainer.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       height = filterContainer.getHeight(); 
       filterContainer.setVisibility(View.GONE); 
       filterContainer.getLayoutParams().height = 0; 
       filterContainer.requestLayout(); 
       ViewTreeObserver obs = filterContainer.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
+3

इससे मुझे यह पता लगाने में मदद मिली कि GetAnimatedValue का उपयोग कैसे करें। धन्यवाद – speedynomads

+0

मूल्य एनिमेटर का बेहतर काम यह है कि यह निर्दिष्ट अवधि के लिए प्रारंभ और अंत बिंदु के बीच मध्यवर्ती मूल्य लेगा और जब तक हम गंतव्य ऊंचाई तक नहीं पहुंच जाते, हम उस इंटरमीडिएट वैल्यू द्वारा हमारी लेआउट ऊंचाई अपडेट कर सकते हैं। साथ ही एनीमेशन बहुत चिकना है। धन्यवाद। –

+0

बहुत बहुत धन्यवाद! उत्तर का दूसरा भाग मुझे बहुत मदद करता है! – Victor