Technika, której użyłem jest podobna do tej przedstawionej w dokumentacji DrawableAnimation i przy użyciu dokumentu API Property Animation.
Najpierw korzystam z klasy ValueAnimator oraz z tablicy int zawierającej identyfikatory rysunków, które będą używane w animacji.
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*/);
Następnie założyć AnimationUpdateListener i określić zmiany w zachowaniu ikona z metodą FloatinActionButton.setImageDrawable (rozciągliwej yourDrawable).
Jednak funkcja ValueAnimator aktualizuje domyślnie każdą dostępną ramkę (w zależności od obciążenia sprzętowego), ale nie musimy przerysowywać ikony, jeśli została już narysowana, dlatego używam zmiennej "i" ; Więc gdy ikona zostanie zastąpiona przez następną, kod czeka, aż nadejdzie czas na losowanie następnej. (Czas zależy od interpolatora zdefiniowanego)
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;
}
}
});
Również jego przydatna podczas odtwarzania animacji wstecz metodą ValueAnimator.reverse();
wiem nie jest pro rozwiązaniem, ale jest to tylko jeden mam postać do pracy nad wszystkimi interfejsami API obsługującymi usługę PropertyAnimation. Jeśli znasz lepsze rozwiązanie, możesz go opublikować tutaj, jeśli nie, mam nadzieję, że ten wpis jest pomocny.