2013-03-27 2 views
5

Questo è così strano, ho il codice di animazione:metodo Animazione applyTransformation non attivato fino a quando clicco qualsiasi layout

public class ExpandAnimation extends Animation { 
private View mAnimatedView; 
private MarginLayoutParams mViewLayoutParams; 
private int mMarginStart, mMarginEnd; 
private boolean mWasEndedAlready = false; 

/** 
* Initialize the animation 
* @param view The layout we want to animate 
* @param duration The duration of the animation, in ms 
*/ 
    public ExpandAnimation(View view, int duration) { 
     setDuration(duration); 
     mAnimatedView = view; 
     mViewLayoutParams = (MarginLayoutParams) view.getLayoutParams(); 

     mMarginStart = mViewLayoutParams.rightMargin; 
     mMarginEnd = (mMarginStart == 0 ? (0- view.getWidth()) : 0); 
     view.setVisibility(View.VISIBLE); 
     mAnimatedView.requestLayout(); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 
     if (interpolatedTime < 1.0f) { 
      // Calculating the new bottom margin, and setting it 
      mViewLayoutParams.rightMargin = mMarginStart 
        + (int) ((mMarginEnd - mMarginStart) * interpolatedTime); 
      // Invalidating the layout, making us seeing the changes we made 
      mAnimatedView.requestLayout(); 

     // Making sure we didn't run the ending before (it happens!) 
     } else if (!mWasEndedAlready) { 
      mViewLayoutParams.rightMargin = mMarginEnd; 
      mAnimatedView.requestLayout(); 
      mWasEndedAlready = true; 
     } 
    } 
} 

e io uso questa animazione:

View parent = (View) v.getParent(); 
View containerMenu = parent.findViewById(R.id.containerMenu); 
ExpandAnimation anim=new ExpandAnimation(containerMenu, 1000); 
containerMenu.startAnimation(anim); 

Questa animazione alternare un layout nascondendo/mostrandolo.

Per impostazione predefinita, è nascosto. Quando clicco, l'animazione funziona e viene mostrata. Quando faccio di nuovo clic, si restringe correttamente. Ma la terza volta, non fa nulla. Ho eseguito il debug e ho scoperto che il costruttore si chiama ma nonapplyTransformation. In qualche modo, se faccio clic su un qualsiasi layout intorno allo schermo, l'animazione inizia improvvisamente.

Qualche idea?

Modifica Qualcuno sa WHEN is applyTransformation triggered?

+0

Sto usando lo stesso codice e ho lo stesso identico problema. applyTranformation non viene mai chiamato la terza o le volte successive. È come se l'animazione dovesse essere ripristinata sulla vista in qualche modo. Ho provato a chiamare containerMenu.clearAnimation() ma non aiuta. –

+0

L'ho combattuto per molte ore, e ancora senza risultato ... – Reinherd

+0

@NetWolf Sono riuscito a trovare una soluzione alternativa. Lo posterò come risposta. – Reinherd

risposta

7

Non riesco a capire perché, ma quando faccio clic o eseguo un'azione su qualsiasi layout, l'animazione inizia finalmente. Così ho aggiunto una soluzione al programma. Ho uno ScrollView nel mio layout, quindi mi muovo la posizione di scorrimento:

hscv.scrollTo(hscv.getScrollX()+1, hscv.getScrollY()+1); 

Questo solo dopo containerMenu.startAnimation(anim);

Questo funziona solo, non riesco a capire il perché.

Inoltre, ho scoperto che alcune animazioni funzionavano perfettamente su android> 4, ma su 2.3, ad esempio, aveva lo stesso problema, ha funzionato per espandersi e restringersi, ma non per espandersi per la seconda volta.

parent.invalidate(); 

Ha fatto il trucco.

+1

Il mio è all'interno di un frammento che si trova all'interno di un ViewPager. Posso aggirare il problema ottenendo l'istanza di viewpager dell'attività e lo scorrimento di 1 pixel e quindi eseguendo il rollback dopo aver chiamato l'animazione. Grazie per il consiglio! –

+0

@NetWolf Ho appena aggiunto 'parent.invalidate();'. Sembra funzionare su 2.3 dispositivi. – Reinherd

+0

Avevo appena trovato la stessa cosa ora che dovevo provare su un vecchio telefono. Grazie per l'aggiornamento. –