2011-11-15 15 views
38

Desidero ridimensionare alcuni layout nella mia attività.Ridimensionamento dei layout a livello di programmazione (come animazione)

ecco il codice del XML principale:

<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> 

Come si può vedere, l'altezza superiore e inferiore del layout è 0, e il layout di mezzo copre tutto il luogo.

Desidero ridurre a livello di codice la dimensione del layout centrale, mentre aumentano sia il primo sia le dimensioni di layout in basso, fino a quando tutti i layout hanno la stessa altezza.

Voglio che sembri un'animazione.

Come devo fare?

Grazie

risposta

91

ho scritto un ResizeAnimation per uno scopo simile. È semplice ma costoso.

/** 
* 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

Penso che questa sia un'ottima [soluzione] (http://stackoverflow.com/a/13381228/1276636). – Sufian

+1

Suppongo che sia necessario sovrascrivere 'public void initialize' e' public boolean willChangeBounds'. –

+0

Grazie mille! –

4

su Honeycomb (Android 3.0) v'è la Animator e ObjectAnimator classi per le animazioni più fluide.

leggerlo here

Esempio su come animare lo spostamento di un gruppo di visualizzazione (LinearLayout) con un interpolatore rimbalzo.

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

Ciò attiverà un'un'animazione fluida con un effetto di rimbalzo e davvero spostare il punto di vista non piace l'animazione prima di nido d'ape. Dai documenti:

Le animazioni precedenti hanno cambiato l'aspetto visivo degli oggetti di destinazione ... ma in realtà non hanno cambiato gli oggetti stessi.

+1

Puoi pubblicare alcuni esempi di codice o più informazioni su questi oggetti @ddcoy? –

Problemi correlati