2015-07-18 5 views
8

Я пытался найти документацию о том, как создать анимацию значков FAB (из библиотеки поддержки Design), после некоторого времени поиска я не смог найти никакой информации об этом и Ссылка AnimationDrawable в разработчиках Android не работает для FAB, даже если класс является дочерним элементом ImageView.анимация анимации FloatingActionButton (анимация анимации для Android FAB src)

, но удается получить обходное решение, которое работает нормально.

ответ

12

Используемая техника аналогична той, которая была показана в документации DrawableAnimation, и с использованием документа API Property Animation.

Сначала я использую класс ValueAnimator и массив int, содержащий идентификаторы чертежей, которые вы собираетесь использовать в своей анимации.

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*/); 

Затем настроить AnimationUpdateListener, и определить изменения в поведении значок с помощью метода FloatinActionButton.setImageDrawable (Drawable yourDrawable).

Но ValueAnimator по умолчанию обновляет каждый доступный кадр (в зависимости от нагрузки на аппаратном уровне), но нам не нужно перерисовывать значок, если он уже был нарисован, поэтому я использую переменную i, ; Поэтому, когда значок заменен на следующий, код ждет, пока не наступит время для следующего. (Выбор времени зависит от интерпол вы определяете)

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; 
      } 
     } 
    }); 

Кроме того, его полезно при воспроизведении анимации в обратном направлении с помощью метода ValueAnimator.reverse();

Я знаю, что это не про решение, но это только один Я фигура чтобы работать со всеми API, поддерживающими PropertyAnimation. Пожалуйста, если вы знаете лучшее решение, разместите его здесь, если нет, я надеюсь, что этот пост будет полезен

Смежные вопросы