2013-08-22 11 views
9

Desidero animare la modifica del padding di una vista. Il luogo di riposo dell'animazione della traduzione è lo stesso del padding che voglio applicare.Come si anima una modifica nel riempimento di una vista?

TranslateAnimation moveleft = new TranslateAnimation(Animation.ABSOLUTE, 0.0f, 
        Animation.ABSOLUTE, PADDING, Animation.ABSOLUTE, 
        0.0f, Animation.ABSOLUTE, 0.0f); 

moveLeft.setDuration(500); 
moveLeft.setFillAfter(true); 

Questo avvia l'animazione della vista quindi imposta il riempimento. Questo non funziona esattamente perché causa un problema tecnico grafico.

v.startAnimation(moveleft); 
v.setPadding(PADDING, 0, 0,0); 

risposta

3

Invece di impostare il padding subito, perché non provare un listener di animazione per impostare il padding dopo che l'animazione è stata completata?

v.setAnimationListener(new Animation.AnimationListener() { 
    ... 
    @Override 
    public void onAnimationEnd(){ 
     v.setPadding(PADDING, 0, 0,0); 
    } 
    ... 
}); 
v.startAnimation(moveleft); 
+0

Ho già provato questa implementazione ma il risultato è stato un errore grafico simile. Tuttavia, ho trovato un modo per risolverlo. Ho chiamato '.clearAnimation()' nella vista animata prima di impostare il padding. Supponevo che il codice in ".onAnimationEnd()" fosse eseguito dopo che l'animazione era terminata. Questo non sembra essere il caso. –

+0

Inoltre ho rimosso '.setFillAfter()'. –

34

Usa ValueAnimator, la sua davvero semplice e unclutter

dire, dobbiamo cambiare padding diritto di _20dp dove come a sinistra padding, superiore e inferiore sono _6dp, _6dp e 0, rispettivamente.

ofInt() è di tipo varagrs. il valore dobbiamo animare è passare in essa come KeyValue coppia (arg1 = valore corrente, valore arg2 = bersaglio, ............)

Ci siamo,

ValueAnimator animator = ValueAnimator.ofInt(view.getPaddingRight(), _20dp); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator){ 
     view.setPadding(_6dp, _6dp, (Integer) valueAnimator.getAnimatedValue(), 0); 
    } 
}); 
animator.setDuration(200); 
animator.start(); 
+2

Ottima soluzione +1 –

Problemi correlati