В зависимости от того, как ваше представление получает цвет фона и как вы получаете целевой цвет, есть несколько разных способов сделать это.
Первые два используют структуру Android Property Animation.
Используйте Object Animator, если:
- Цвет фона вашего представления определен как значение
argb
в файле xml.
- Цвет вашего представления ранее был установлен
view.setBackgroundColor()
- Цвет фона вашего представления определен в чертеже, который НЕ определяет какие-либо дополнительные свойства, такие как обводка или радиусы углов.
- Цвет фона вашего представления определен в чертеже, и вы хотите удалить любые дополнительные свойства, такие как обводка или радиусы углов, имейте в виду, что удаление дополнительных свойств не будет анимировано.
Аниматор объекта работает, вызывая view.setBackgroundColor
, который заменяет определенный drawable, если он не является экземпляром ColorDrawable
, что бывает редко. Это означает, что любые дополнительные свойства фона из рисования, например обводки или углов, будут удалены.
Используйте Value Animator, если:
- Цвет фона вашего представления определен в Drawable, который также устанавливает такие свойства, как обводка или радиусы углов, И вы хотите изменить его на новый цвет, который определяется во время работы.
Используйте переход с возможностью рисования, если:
- Ваше представление должно переключаться между двумя чертежами, которые были определены перед развертыванием.
У меня были некоторые проблемы с производительностью с чертежами Transition, которые выполняются, пока я открываю DrawerLayout, которые я не смог решить, поэтому, если вы столкнетесь с каким-либо неожиданным заиканием, вы можете столкнуться с той же ошибкой, что и я.
Вам придется изменить пример Value Animator, если вы хотите использовать Можно рисовать списки состояний или создавать списки слоев, в противном случае произойдет сбой в строке final GradientDrawable background = (GradientDrawable) view.getBackground();
.
Object Animator:
Просмотр определения:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Создайте и используйте ObjectAnimator
вот так.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Вы также можете загрузить определение анимации из xml с помощью AnimatorInflater, как это делает XMight в Android objectAnimator animate backgroundColor of Layout
Value Animator:
Просмотр определения:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Возможное определение:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/>
<stroke
android:color="#edf0f6"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
Создайте и используйте ValueAnimator следующим образом:
final ValueAnimator valueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
final GradientDrawable background = (GradientDrawable) view.getBackground();
currentAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animator) {
background.setColor((Integer) animator.getAnimatedValue());
}
});
currentAnimation.setDuration(300);
currentAnimation.start();
Переход с возможностью рисования:
Просмотр определения:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Возможное определение:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#FFFFFF"/>
<stroke
android:color="#edf0f6"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
</item>
<item>
<shape>
<solid android:color="#78c5f9"/>
<stroke
android:color="#68aff4"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
</item>
</transition>
Используйте TransitionDrawable следующим образом:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Вы можете отменить анимацию, вызвав .reverse()
в экземпляре анимации.
Есть и другие способы создания анимации, но эти три, вероятно, наиболее распространены. Обычно я использую ValueAnimator.
person
Mattias
schedule
10.09.2013