Dependendo de como sua exibição obtém a cor de fundo e de como você obtém a cor de destino, existem várias maneiras diferentes de fazer isso.
Os dois primeiros usam a estrutura Android Property Animation .
Use um Animador de Objetos se:
- Sua visualização tem a cor de fundo definida como
argb
valor em um arquivo xml.
- Sua visualização teve sua cor definida anteriormente por
view.setBackgroundColor()
- Sua visualização tem sua cor de plano de fundo definida em um drawable que NÃO define propriedades extras, como traços ou raios dos cantos.
- Sua visualização tem a cor de fundo definida em um drawable e você deseja remover propriedades extras, como traços ou raios de canto, lembre-se de que a remoção das propriedades extras não será animada.
O animador de objeto trabalha chamando view.setBackgroundColor
que substitui o drawable definido, a menos que seja uma instância de a ColorDrawable
, o que raramente é. Isso significa que quaisquer propriedades extras de fundo de um drawable, como traços ou cantos, serão removidas.
Use um Value Animator se:
- Sua visualização tem sua cor de plano de fundo definida em um drawable que também define propriedades como os traços do raio ou do canto E você deseja alterá-la para uma nova cor que é decidida durante a execução.
Use um drawable Transition se:
- Sua visão deve alternar entre dois desenháveis que foram definidos antes da implantação.
Eu tive alguns problemas de desempenho com os drawables Transition que são executados enquanto eu abro um DrawerLayout que não consegui resolver, portanto, se você encontrar alguma gagueira inesperada, poderá ter o mesmo bug que eu.
Você precisará modificar o exemplo do Value Animator se desejar usar um drawable StateLists ou um drawable LayerLists , caso contrário, ele travará na final GradientDrawable background = (GradientDrawable) view.getBackground();
linha.
Animador de Objetos :
Ver definição:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Crie e use um ObjectAnimator
como este.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Você também pode carregar a definição de animação de um xml usando um AnimatorInflater como o XMight faz no objeto Android.
Value Animator :
Ver definição:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definição 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>
Crie e use um ValueAnimator como este:
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();
Drawable de transição :
Ver definição:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definição 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>
Use o TransitionDrawable assim:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Você pode reverter as animações chamando .reverse()
a instância de animação.
Existem outras maneiras de fazer animações, mas essas três são provavelmente as mais comuns. Eu geralmente uso um ValueAnimator.