2015-07-18 16 views
8

Stavo cercando di trovare la documentazione su come creare l'animazione delle icone di FAB (della libreria di supporto di progettazione), dopo aver cercato un po 'non sono riuscito a trovare alcuna informazione a riguardo Il riferimento AnimationDrawable negli sviluppatori Android non funziona con FAB anche se la classe è figlia di ImageView.Animazione icona FloatingActionButton (animazione FAB src drawable Android)

ma riescono a ottenere una soluzione che funziona bene.

risposta

12

La tecnica che ho utilizzato è simile a quella esposta nella documentazione DrawableAnimation e utilizzando il documento API Property Animation.

Prima di tutto utilizzo la classe ValueAnimator e un array int contenente gli ID dei drawable che si useranno nell'animazione dell'utente.

final int[] ids = {R.drawable.main_button_1,R.drawable.main_button_2,R.drawable.main_button_3,R.drawable.main_button_4,R.drawable.main_button_5,R.drawable.main_button_6, R.drawable.main_button_7}; 
    fab = (FloatingActionButton) findViewById(R.id.yourFabID); 
    valueAnimator = ValueAnimator.ofInt(0, ids.length - 1).setDuration(yourAnimationTime); 
    valueAnimator.setInterpolator(new LinearInterpolator() /*your TimeInterpolator*/); 

quindi impostare un AnimationUpdateListener, e definiscono il cambiamento di comportamento icona con il metodo FloatinActionButton.setImageDrawable (Drawable yourDrawable).

Eppure il ValueAnimator aggiorna di default ogni frame disponibile (a seconda del carico nell'hardware), ma non è necessario ridisegnare l'icona se è già stata disegnata, quindi è per questo che uso la variabile "i" ; Quindi, una volta che un'icona è stata sostituita da quella successiva, il codice attende fino a quando è il momento per il successivo da disegnare. (La sincronizzazione dipende dal interpolatore si definisce)

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     int i = -1; 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      int animatedValue = (int) animation.getAnimatedValue(); 
      if(i!=animatedValue) { 
       fab.setImageDrawable(getResources().getDrawable(ids[animatedValue])); 
       i = animatedValue; 
      } 
     } 
    }); 

Anche il suo utile quando si riproduce l'animazione all'indietro con il metodo ValueAnimator.reverse();

so che non è una soluzione pro ma è l'unico che ho figura a lavorare su tutte le API che supportano PropertyAnimation. Per favore se conosci una soluzione migliore postala qui, altrimenti spero che questo post sia utile