¿Cómo se anima el cambio de color de fondo de una vista en Android?
Por ejemplo:
Tengo una vista con un color de fondo rojo. El color de fondo de la vista cambia a azul. ¿Cómo puedo hacer una transición suave entre colores?
Si esto no se puede hacer con vistas, una alternativa será bienvenida.
android
animation
view
background-color
hpique
fuente
fuente
Respuestas:
¡Terminé buscando una solución (bastante buena) para este problema!
Puede usar un TransitionDrawable para lograr esto. Por ejemplo, en un archivo XML en la carpeta dibujable, podría escribir algo como:
Luego, en su XML para la Vista real, haría referencia a este TransitionDrawable en el
android:background
atributo.En este punto, puede iniciar la transición en su código de comando haciendo lo siguiente:
O ejecute la transición en reversa llamando a:
Vea la respuesta de Roman para otra solución usando la API de animación de propiedades, que no estaba disponible en el momento en que esta respuesta se publicó originalmente.
fuente
Puede usar la nueva API de animación de propiedades para la animación en color:
Para compatibilidad con versiones anteriores de Android 2.x, use la biblioteca Nine Old Androids de Jake Wharton.
El
getColor
método fue desaprobado en Android M, por lo que tiene dos opciones:Si usa la biblioteca de soporte, debe reemplazar las
getColor
llamadas con:Si no utiliza la biblioteca de soporte, debe reemplazar las
getColor
llamadas con:fuente
ValueAnimator.ofArgb(colorFrom, colorTo)
parece más al punto, pero lamentablemente es nuevo.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:
argb
valor en un archivo xml.view.setBackgroundColor()
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:
Use una transición dibujable si:
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:
Crea y usa un
ObjectAnimator
como este.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:
Definición dibujable:
Cree y use un ValueAnimator como este:
Transición dibujable :
Ver definición:
Definición dibujable:
Use el TransitionDrawable de esta manera:
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.
fuente
Puedes hacer un animador de objetos. Por ejemplo, tengo un targetView y quiero cambiar el color de fondo:
fuente
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Su implementación es justaofInt(...).setEvaluator(new ArgbEvaluator())
.Si quieres una animación en color como esta,
este código te ayudará a:
fuente
anim.setRepeatCount(ValueAnimator.INFINITE);
Animaciónla mejor manera es usar ValueAnimator y
ColorUtils.blendARGB
fuente
Otra forma fácil de lograr esto es realizar un desvanecimiento usando AlphaAnimation.
fuente
Este es el método que uso en una Actividad base para cambiar el fondo. Estoy usando GradientDrawables generados en código, pero podría adaptarse para adaptarse.
actualización: en caso de que alguien se encuentre con el mismo problema que encontré, por alguna razón en Android <4.3 usando
setCrossFadeEnabled(true)
causa un efecto de blanqueo no deseado, por lo que tuve que cambiar a un color sólido para <4.3 usando el método @Roman Minenok ValueAnimator mencionado anteriormente.fuente
La respuesta se da de muchas maneras. También se puede utilizar
ofArgb(startColor,endColor)
deValueAnimator
.para API> 21:
fuente
La documentación sobre animaciones basadas en XML es horrible. He buscado alrededor de horas solo para animar el color de fondo de un botón al presionar ... Lo triste es que la animación está a solo un atributo de distancia: puede usar
exitFadeDuration
enselector
:Luego, utilícelo como
background
para su vista. No se necesita código Java / Kotlin.fuente
android:enterFadeDuration
; mi experiencia fue que, sin ella, mi animación no funcionó la segunda vez.Aquí hay una buena función que permite esto:
Y en Kotlin:
fuente
agregue un animador de carpeta a la carpeta res . (el nombre debe ser animador ). Agregue un archivo de recursos de animador. Por ejemplo res / animator / fade.xml
Dentro del archivo Java de actividad, llame a esto
fuente
Use la siguiente función para Kotlin:
Pase cualquier vista de la que desee cambiar el color.
fuente
Descubrí que la implementación utilizada
ArgbEvaluator
en el código fuente de Android funciona mejor en la transición de colores. Al usar HSV, dependiendo de los dos colores, la transición fue saltar a través de demasiados tonos para mí. Pero este método no lo es.Si usted está tratando de animar simplemente, el uso
ArgbEvaluator
conValueAnimator
como se sugiere aquí :Sin embargo, si usted es como yo y desea vincular su transición con algún gesto del usuario u otro valor pasado de una entrada, esto
ValueAnimator
no es de mucha ayuda (a menos que esté apuntando a la API 22 y superior, en cuyo caso puede usar elValueAnimator.setCurrentFraction()
método ) Cuando apunte por debajo de API 22, ajuste el código encontrado en elArgbEvaluator
código fuente en su propio método, como se muestra a continuación:Y úsalo como quieras.
fuente
Basado en la respuesta de ademar111190 , he creado este método que emitirá el color de fondo de una vista entre dos colores:
fuente