Используемая техника аналогична той, которая была показана в документации 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. Пожалуйста, если вы знаете лучшее решение, разместите его здесь, если нет, я надеюсь, что этот пост будет полезен