2011-11-15 17 views
38

मैं अपनी गतिविधि में कुछ लेआउट का आकार बदलना चाहता हूं।लेआउट को प्रोग्रामेटिक रूप से बदलना (एनीमेशन के रूप में)

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/top" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:background="#3ee3e3" > 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/middle" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:background="#fe51e6" > 
    </LinearLayout> 
</LinearLayout> 

आप देख सकते हैं, ऊपर और नीचे लेआउट ऊंचाई के 0 है, और मध्य लेआउट सभी जगह शामिल किया गया है:

यहां मुख्य एक्सएमएल का कोड है।

मैं मध्यम लेआउट आकार को प्रोग्रामेटिक रूप से कम करना चाहता हूं, जबकि शीर्ष और नीचे लेआउट आकार दोनों को बढ़ाएं, जब तक सभी लेआउट समान ऊंचाई न हों।

मैं इसे एनीमेशन की तरह दिखाना चाहता हूं।

मुझे यह कैसे करना चाहिए?

धन्यवाद

उत्तर

91

मैं एक ऐसी ही उद्देश्य के लिए एक ResizeAnimation लिखा था। यह आसान लेकिन महंगा है।

/** 
* an animation for resizing the view. 
*/ 
public class ResizeAnimation extends Animation { 
    private View mView; 
    private float mToHeight; 
    private float mFromHeight; 

    private float mToWidth; 
    private float mFromWidth; 

    public ResizeAnimation(View v, float fromWidth, float fromHeight, float toWidth, float toHeight) { 
     mToHeight = toHeight; 
     mToWidth = toWidth; 
     mFromHeight = fromHeight; 
     mFromWidth = fromWidth; 
     mView = v; 
     setDuration(300); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     float height = 
       (mToHeight - mFromHeight) * interpolatedTime + mFromHeight; 
     float width = (mToWidth - mFromWidth) * interpolatedTime + mFromWidth; 
     LayoutParams p = mView.getLayoutParams(); 
     p.height = (int) height; 
     p.width = (int) width; 
     mView.requestLayout(); 
    } 
} 
+1

मुझे लगता है कि यह एक महान [समाधान] (http://stackoverflow.com/a/13381228/1276636) है। – Sufian

+1

मुझे लगता है कि आपको 'सार्वजनिक शून्य प्रारंभिक 'और' सार्वजनिक बूलियन WillChangeBounds' को ओवरराइड करने की आवश्यकता है। –

+0

बहुत बहुत धन्यवाद! –

4

हनीकोम्ब पर (एंड्रॉयड 3.0) वहाँ चिकनी एनिमेशन के लिए Animator और ObjectAnimator वर्गों है।

पढ़ें यह here

कैसे एक उछाल क्षेपक के साथ एक दृश्य के समूह (LinearLayout) के इस कदम चेतन करने के लिए पर उदाहरण।

BounceInterpolator bounceInterpolator = new BounceInterpolator(); 
ObjectAnimator anim = ObjectAnimator.ofFloat(myViewGroup, "translationY", 0f, -200); 
anim.setInterpolator(bounceInterpolator); 
anim.setDuration(1100).start(); 

यह बाउंस प्रभाव के साथ एक चिकनी एनीमेशन ट्रिगर करेगा और वास्तव में हनीकॉम से पहले एनीमेशन की तरह विचारों को स्थानांतरित करेगा। दस्तावेज़ों से:

पिछले एनिमेशन ने लक्षित वस्तुओं की दृश्य उपस्थिति को बदल दिया ... लेकिन उन्होंने वास्तव में वस्तुओं को स्वयं नहीं बदला।

+1

क्या आप इन ऑब्जेक्ट्स @ddcoy पर कुछ कोड नमूने या अधिक जानकारी पोस्ट कर सकते हैं? –

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