2015-07-18 17 views
8

Próbowałem znaleźć dokumentację dotyczącą tworzenia animacji ikon FAB (biblioteki wsparcia projektu), po pewnym czasie nie mogłem znaleźć żadnych informacji na ten temat. Odniesienie AnimationDrawable w programistach Androida nie działa dla FAB, nawet jeśli klasa jest dzieckiem ImageView.Animacja ikony FloatingActionButton (animacja rysowania FAB src)

ale udaje się uzyskać obejście, które działa dobrze.

Odpowiedz

12

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.