В зависимости от того, как ваш вид получает цвет фона и как вы получаете целевой цвет, есть несколько разных способов сделать это.
Первые два используют фреймворк Android Property Animation .
Используйте Аниматор Объектов, если:
- Ваш вид имеет фоновый цвет, определенный как
argb
значение в XML-файле.
- Ваш вид ранее имел свой цвет, установленный
view.setBackgroundColor()
- Ваш вид имеет цвет фона, определенный в рисовании, который НЕ определяет никаких дополнительных свойств, таких как радиус обводки или угла.
- Ваш вид имеет цвет фона, заданный в режиме рисования, и вы хотите удалить любые дополнительные свойства, такие как обводки или угловые радиусы, имейте в виду, что удаление дополнительных свойств не будет анимированным.
Аниматор объекта работает путем вызова, view.setBackgroundColor
который заменяет определенный объект рисования, если только он не является экземпляром a ColorDrawable
, которым он редко является. Это означает, что любые дополнительные свойства фона из рисованного объекта, такого как обводка или углы, будут удалены.
Используйте Value Animator, если:
- Ваш вид имеет цвет фона, заданный в чертеже, который также устанавливает свойства, такие как обводка или угловые радиусы, и вы хотите изменить его на новый цвет, который определяется во время работы.
Используйте рисование перехода, если:
- Ваше представление должно переключаться между двумя объектами рисования, которые были определены до развертывания.
У меня были некоторые проблемы с производительностью отрисовок Transition, которые запускаются при открытии DrawerLayout, которые я не смог решить, поэтому, если вы столкнетесь с неожиданным заиканием, вы можете столкнуться с той же ошибкой, что и я.
Вам нужно будет изменить пример Value Animator, если вы хотите использовать рисование StateLists или LayerLists , в противном случае он потерпит крах на final GradientDrawable background = (GradientDrawable) view.getBackground();
линии.
Аниматор объекта :
Посмотреть определение:
<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
Значение аниматора :
Посмотреть определение:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Drawable определение:
<?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"/>
Drawable определение:
<?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.