2011-10-26 24 views
39

ठीक चौड़ाई, तो मैं बाहर http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.htmlObjectAnimator चेतन LinearLayout

जाँच की वह आप एक निश्चित समय में एक वस्तु की संपत्ति चेतन कर सकते हैं कहते हैं। और मैंने वस्तुओं के चारों ओर घूमने की कोशिश की और यह ठीक लग रहा है। जब मैं लाइनरलाइट की चौड़ाई बदल रहा था तो मुझे एक समस्या का सामना करना पड़ा। "MyWidth"

public void setMyWidth(int myWidth) { 
    LinearLayout.LayoutParams params = (LayoutParams) getLayoutParams(); 
    params.weight = myWidth; 
    setLayoutParams(params); 
    requestLayout(); 
    this.myWidth = myWidth; 
} 

कोई भाग्य के साथ

10-26 14:51:27.190: E/PropertyValuesHolder(12681): Couldn't find setter/getter for  property width with value type float 

तब मैं LinearLayout का विस्तार करने की कोशिश की,: मैं इस मिला है। फिर मैंने लेआउटपैम्स को बदलने की कोशिश की। विड्थ, जावा इतिहास में चौड़ाई और ऊंचाई बदलती है, और ऑब्जेक्टएनिमीटर को गेटर और सेटर की आवश्यकता होती है। कोई भाग्य नहीं। मैं कहने के लिए शर्मिंदा हूं कि मैंने लेआउटपैम को भी विस्तारित करने की कोशिश की ... बिना किसी किस्मत के।

कोई भी ऐसी चीज करने में सफल रहा? मैंने पुराने android.view.animation का उपयोग किया और मुझे वह चाहिए जो मैं चाहता था, लेकिन मैं भविष्य के लिए उत्सुक हूं।

+0

दुर्भाग्य से, मैं एक ऐसी ही समस्या है। चौड़ाई को एनिमेट करने के बजाय, मैंने वही प्रभाव प्राप्त करने के लिए वेटसम (जिसे गेटटर/सेटर होता है) को एनिमेट करने का प्रयास किया। हो सकता है कि आप जो कुछ भी चाहते हैं उसे हासिल करने के लिए कुछ ऐसा करने का प्रयास कर सकें, लेकिन मैं इसे काम नहीं कर सकता: http://stackoverflow.com/questions/8341745/animating-weightsum-property-using-objectanimator। अगर आपके पास कुछ परिणाम हैं – Entreco

उत्तर

19

यह इस काम के लायक है। लेआउट पैराम्स पर चौड़ाई बदलने के बाद आपको लेआउट पैराम्स ऑब्जेक्ट को रीसेट करना होगा।

private class WidthEvaluator extends IntEvaluator { 

    private View v; 
    public WidthEvaluator(View v) { 
     this.v = v; 
    } 

    @Override 
    public Object evaluate(float fraction, Object startValue, Object endValue) { 
     int num = (Integer)super.evaluate(fraction, startValue, endValue); 
     ViewGroup.LayoutParams params = v.getLayoutParams(); 
     params.width = num; 
     v.setLayoutParams(params); 
     return num; 
    } 
} 

// your client code 
ValueAnimator.ofObject(new WidthEvaluator(box), box.getWidth(), v.getWidth()).start(); 
+3

इस काम को नौ ओल्ड एंड्रॉइड के साथ बनाने के लिए, ऑब्जेक्ट के बजाय इंटीजर का उपयोग करने के लिए मूल्यांकन विधि हस्ताक्षर बदलें, मैं आपको पोस्ट कर दूंगा। 'सार्वजनिक इंटीजर मूल्यांकन (फ्लोट अंश, इंटीजर स्टार्टवैल्यू, इंटीजर एंडवैल्यू) ' – loeschg

+0

व्यू परिवर्तनों को करने के लिए मूल्यांकनकर्ताओं का उपयोग न करें। इसके बजाए 'एनीमेटर अपडेट लिस्टनर' जोड़ें। –

109

स्थितियों में जहां एक सरल संपत्ति गेटर/सेटर आप ValueAnimator का उपयोग करें और मैन्युअल रूप से एनीमेशन प्रदर्शन करना चाहिए नहीं है।

मान लिया जाये:

  • वी दृश्य आपको एनिमेट रहे
  • END_WIDTH है पिक्सल में देखने का लक्ष्य चौड़ाई है।
  • DURATION मिलीसेकंड में एनीमेशन की वांछित लंबाई है।

आपका कोड कुछ इस तरह दिखना चाहिए:

ValueAnimator anim = ValueAnimator.ofInt(v.getMeasuredWidth(), END_WIDTH); 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      int val = (Integer) valueAnimator.getAnimatedValue(); 
      ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); 
      layoutParams.width = val; 
      v.setLayoutParams(layoutParams); 
     } 
    }); 
    anim.setDuration(DURATION); 
    anim.start(); 
+0

नकारात्मक और 11 से आगे ... – desgraci

+2

आप पुराने संस्करणों के लिए http://nineoldandroids.com/ का उपयोग कर सकते हैं। – lordmegamax

+0

बहुत अच्छा जवाब, धन्यवाद! – CyberDandy

6

आप एक गलती

params.weight = myWidth; 

मुझे लगता है कि यह params.width नहीं params.weight है बना दिया है

1

मुझे लगता है कि इस wou को पूरा करने का एक बेहतर तरीका एलडी व्यू के स्केलएक्स और स्केलवाई प्रॉपर्टी का उपयोग करना है जिसे व्यू क्लास में सभी तरह से परिभाषित किया गया है, इसलिए यह व्यावहारिक रूप से किसी भी दृश्य या लेआउट के साथ मान्य होगा।

उदाहरण के लिए, इस

ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(MyLinearLayout,"ScaleX",0,1); 
objectAnimator.setDuration(300); 
objectAnimator.start(); 

यह काम करता है पर विचार करें।

+4

नहीं, यह काम नहीं करता है। यह तराजू, यानी फैला हुआ है, दृश्य, जो इसे देखने से अलग है, दृश्य की सामग्री के अनुपात को बरकरार रखता है। –

5

मैंने एक छोटी लाइब्रेरी ViewPropertyObjectAnimator बनाई है जो इसे एक बहुत ही सरल तरीके से कर सकती है (और Tomer Weller द्वारा प्रस्तावित इस तरह के समान दृष्टिकोण का उपयोग करती है)।

आप के साथ इस एनीमेशन प्राप्त कर सकते थे (यह मानते हुए mLinearLayout एनिमेटेड View है और mEndWidthView's चौड़ाई के अंत मान है):

ViewPropertyObjectAnimator.animate(mLinearLayout).width(mEndWidth).start(); 
+0

अच्छी लाइब्रेरी, @ Bartosz! –

+0

धन्यवाद @StephenKaiser :)! यह काफी सरल लेकिन बहुत उपयोगी है। –