Dependiendo de cómo obtiene su vista el color de fondo y cómo obtiene el color de destino hay varias formas diferentes de hacerlo.
Los dos primeros usan el marco Android Property Animation.
Utilice un Object Animator si:
- Su punto de vista tiene su color de fondo define como un valor
argb
en un archivo XML.
- Su vista ya han tenido establecer su color por
view.setBackgroundColor()
- Su punto de vista tiene su color de fondo se define en una estirable que no define propiedades adicionales como accidente cerebrovascular o radios de las esquinas.
- Su vista tiene su color de fondo definido en un dibujo y desea eliminar cualquier propiedad adicional como trazo o radios de esquina, tenga en cuenta que la eliminación de las propiedades adicionales no se animará.
El objeto animador funciona llamando view.setBackgroundColor
que sustituye al dibujable definido a menos que es una instancia de una ColorDrawable
, que rara vez es. Esto significa que se eliminarán todas las propiedades de fondo adicionales de un trazo como trazos o esquinas.
Utilice un Value Animator si:
- Su punto de vista tener su color de fondo se define en una estirable que también establece las propiedades como el golpe o esquina radios y desea cambiarlo a un nuevo color que se decidió durante la ejecución .
Utilice un Transition drawable si:
- Su visión debe cambiar entre dos estirable que se han definido antes del despliegue.
he tenido algunos problemas de rendimiento con dibujables de transición que se ejecuta mientras yo estoy abriendo una DrawerLayout que no he sido capaz de resolver, por lo que si encuentra algún tartamudeo inesperada que podría haber topado con el mismo error que yo tener.
Deberá modificar el ejemplo de Value Animator si desea utilizar un StateLists drawable o un LayerLists drawable, de lo contrario, se bloqueará en la línea final GradientDrawable background = (GradientDrawable) view.getBackground();
.
Object Animator:
Ver definición:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
crear y utilizar 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 a partir de un XML usando un AnimatorInflater como XMight hace en Android objectAnimator animate backgroundColor of Layout
Value Animator:
Ver definición:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
definición Disponibles:
<?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>
crear y utilizar un ValueAnimator así:
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();
Transition drawable:
Ver definición:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
definición Disponibles:
<?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>
Uso del TransitionDrawable así:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
puede invertir el animaciones llamando .reverse()
en la instancia de animación.
Hay algunas otras maneras de hacer las animaciones, pero estos tres es probablemente el más común. Generalmente uso un ValueAnimator.
Uno esperaría que una transición suave entre los colores no debería ser un problema para una plataforma como Android. Sin embargo, las vistas no están hechas para eso. La pregunta sigue en pie. – hpique
Un buen [tutorial en video] (https://www.youtube.com/watch?v=bSgUn2rZiko) –