2013-08-02 19 views
10

Nel mio file di layout principale, ho un RelativeLayout, con un peso di 1 (in pratica per visualizzare una mappa) sopra un LinearLayout con un peso di 2, ha dichiarato in questo modo:modificare il peso del layout con un'animazione

<LinearLayout 
    android:id="@+id/GlobalLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/UpLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" > 
    </RelativeLayout> 

    <LinearLayout 
     android:id="@+id/DownLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="2" 
     android:orientation="vertical" > 
    </LinearLayout> 

</LinearLayout> 

DownLayout contiene un elenco di elementi, quando faccio clic su un elemento, vorrei modificare il peso di DownLayout per 4, quindi il layout superiore (la mappa) richiede solo 1/5 dello schermo anziché 1/3.

sono riuscito a farlo modificando le LayoutParams:

LinearLayout linearLayout = (LinearLayout) mActivity.findViewById(R.id.DownLayout); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
    params.weight = 4.0f; 
    linearLayout.setLayoutParams(params); 

Funziona ma non sono soddisfatto, il cambiamento è troppo immediato, non c'è transizione, mentre mi piacerebbe che fosse liscia. C'è un modo per usare l'animazione per questo?

ho trovato alcuni esempi con ObjectAnimator di cambiare il weightSum, ma non è così voglio voglio (se cambio solo questa proprietà, ho un po 'di spazio libero sotto il mio layout giù):

 float ws = mLinearLayout.getWeightSum(); 
     ObjectAnimator anim = ObjectAnimator.ofFloat(mLinearLayout, "weightSum", ws, 5.0f); 
     anim.setDuration(3000); 
     anim.addUpdateListener(this); 
     anim.start(); 

Is c'è un modo per usare ObjectAnimator (o qualcos'altro) per farlo?

Grazie!

risposta

24

Recentemente mi sono imbattuto in un problema simile e l'ho risolto utilizzando un'animazione standard (devo scegliere come target l'API 10, quindi non ho potuto utilizzare ObjectAnimator). Ho usato una combinazione della risposta here con lievi modifiche per prendere in considerazione il peso anziché l'altezza.

mia abitudine classe animazione appare come segue ...

private class ExpandAnimation extends Animation { 

    private final float mStartWeight; 
    private final float mDeltaWeight; 

    public ExpandAnimation(float startWeight, float endWeight) { 
     mStartWeight = startWeight; 
     mDeltaWeight = endWeight - startWeight; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContent.getLayoutParams(); 
     lp.weight = (mStartWeight + (mDeltaWeight * interpolatedTime)); 
     mContent.setLayoutParams(lp); 
    } 

    @Override 
    public boolean willChangeBounds() { 
     return true; 
    } 
} 

E la sua chiamata con questo metodo ...

public void toggle() { 
    Animation a; 
    if (mExpanded) { 
     a = new ExpandAnimation(mExpandedWeight, mCollapsedWeight); 
     mListener.onCollapse(mContent); 
    } else { 
     a = new ExpandAnimation(mCollapsedWeight, mExpandedWeight); 
     mListener.onExpand(mContent); 
    } 

    a.setDuration(mAnimationDuration); 
    mContent.startAnimation(a); 
    mExpanded = !mExpanded; 
} 

Speriamo che questo vi aiuterà fuori, se avete bisogno di maggiori dettagli o avere domande su qualcosa fammelo sapere

+0

Grazie per quello! Ho finito per fare qualcosa di completamente diverso, senza animazione, ma proverò sicuramente il tuo metodo! – jbihan

+0

@jbihan! puoi condividere il tuo metodo per risolvere questo problema? –

+0

Ciao! In realtà, come ho detto sopra, ho fatto qualcosa senza animazione, nel senso che ho usato solo 2 semplici attività, non sono riuscito ad avere un'animazione abbastanza fluida da renderlo bello – jbihan

Problemi correlati