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
fonte
2015-07-18 03:41:19