Dependiendo de cómo su vista obtiene su color de fondo y cómo obtiene su color de destino, hay varias formas diferentes de hacerlo.
Los dos primeros usan la animación de propiedad de Android marco de .
Usar una animador de objetos si:
- Su vista tiene su color de fondo definido como
argb
valor en un archivo xml.
- Su vista ha tenido previamente su color establecido por
view.setBackgroundColor()
- Su vista tiene su color de fondo definido en un dibujo que NO define ninguna propiedad adicional como el trazo o los radios de las esquinas.
- Su vista tiene su color de fondo definido en un dibujable y desea eliminar cualquier propiedad adicional como el trazo o el radio de esquina, tenga en cuenta que la eliminación de las propiedades adicionales no será animada.
El animador de objetos funciona mediante una llamada view.setBackgroundColor
que reemplaza el dibujo definido a menos que sea una instancia de unColorDrawable
, que rara vez lo es. Esto significa que se eliminarán las propiedades de fondo adicionales de un trazo como trazos o esquinas.
Use un Value Animator si:
- Su vista tiene su color de fondo definido en un dibujo que también establece propiedades como el trazo o los radios de esquina Y desea cambiarlo a un nuevo color que se decida mientras se ejecuta.
Use una transición dibujable si:
- Su vista debe cambiar entre dos dibujables que se han definido antes de la implementación.
He tenido algunos problemas de rendimiento con los elementos de transición de Transition que se ejecutan mientras estoy abriendo un DrawerLayout que no he podido resolver, por lo que si encuentra un tartamudeo inesperado, es posible que se haya encontrado con el mismo error que yo.
Tendrá que modificar el ejemplo de Value Animator si desea usar un dibujo de StateLists o un dibujo de LayerLists , de lo contrario se bloqueará en la final GradientDrawable background = (GradientDrawable) view.getBackground();
línea.
Animador de objetos :
Ver definición:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Crea y usa un ObjectAnimator
como este.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
También puede cargar la definición de animación desde un xml usando un AnimatorInflater como lo hace XMight en un objeto Android Fondo animado del animador Color de diseño
Animador de valor :
Ver definición:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definición dibujable:
<?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>
Cree y use un 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();
Transición dibujable :
Ver definición:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definición dibujable:
<?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 el TransitionDrawable de esta manera:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Puedes revertir las animaciones llamando .reverse()
a la instancia de animación.
Hay otras formas de hacer animaciones, pero estas tres son probablemente las más comunes. Generalmente uso un ValueAnimator.