В зависимости от того, как ваш вид получает цвет фона и как вы получаете целевой цвет, есть несколько разных способов сделать это.
Первые два используют Android Property Animation framework.
Использовать Аниматор объектов , если:
- Цвет вашего представления определен как значение
argb
в файле XML.
- Цвет вашего просмотра ранее был установлен на
view.setBackgroundColor()
- Ваш вид имеет цвет фона, заданный в чертеже, который НЕ определяет любые дополнительные свойства, такие как радиус обводки или угла.
- Цвет вашего вида определен в виде отрисовки, и вы хотите удалить любые дополнительные свойства, такие как радиус обводки или угла, имейте в виду, что удаление дополнительных свойств не будет анимированным.
Аниматор объектов работает, вызывая view.setBackgroundColor
, который заменяет определенный объект рисования, если только он не является экземпляром ColorDrawable
, которым он редко является. Это означает, что любые дополнительные свойства фона из таких объектов, как обводка или углы, будут удалены.
Использовать Значение аниматора , если:
- Ваш вид имеет цвет фона, заданный в чертеже, который также устанавливает свойства, такие как обводка или угловые радиусы, и вы хотите изменить его на новый цвет, который определяется во время работы.
Использовать Переходный чертеж , если:
- Ваше представление должно переключаться между двумя объектами рисования, которые были определены до развертывания.
У меня были некоторые проблемы с производительностью отрисовок Transition, которые запускаются при открытии DrawerLayout, которые я не смог решить, поэтому, если вы столкнетесь с неожиданным заиканием, вы можете столкнуться с той же ошибкой, что и я.
Вам придется изменить пример Value Animator, если вы хотите использовать StateLists drawable или LayerLists drawable , в противном случае произойдет сбой в строке 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-объектAnimator animate backgroundColor of Layout
Значение аниматора :
Просмотр определения:
<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.