Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Animar el cambio de color de fondo de la vista en Android

¿Cómo animar el cambio de color de fondo de una vista en Android?

Por ejemplo:

  • Cambiar fuente del editor de Android Studio por Mac?
  • ¿Cómo instalar un apk en el emulador en Android Studio?
  • Android parcelable referenciando otra dependencia circular parcelable
  • Android-studio El directorio seleccionado no es válido para Android SDK de Android
  • ¿Cómo puedo configurar Debug Certificate for Android ApkBuilder
  • Obtener todas las filas de SQLite
  • 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 los colores?

    Si esto no puede hacerse con vistas, una alternativa será bienvenida.

  • Obtener el ancho y la altura de los componentes en vista Fragmento
  • Square LeakCanary No se puede encontrar el símbolo
  • Agrupe varias aplicaciones bajo el mismo icono en el Lanzador de aplicaciones
  • Diferencia entre OnTouch y OnClick Android
  • Haga que Ctrl + F11 inicie el proyecto de Android incluso cuando esté en un archivo XML
  • Cómo hacer la frontera para el círculo de la imagen recortada en deslizamiento
  • 9 Solutions collect form web for “Animar el cambio de color de fondo de la vista en Android”

    Terminé por encontrar una solución (bastante buena) para este problema!

    Puede utilizar un TransitionDrawable para lograr esto. Por ejemplo, en un archivo XML en la carpeta dibujable podría escribir algo como:

    <?xml version="1.0" encoding="UTF-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. --> <item android:drawable="@drawable/original_state" /> <item android:drawable="@drawable/new_state" /> </transition> 

    Entonces, en su XML para la Vista actual, haría referencia a este TransitionDrawable en el atributo android:background .

    En este punto, puede iniciar la transición en su código on-command haciendo:

     TransitionDrawable transition = (TransitionDrawable) viewObj.getBackground(); transition.startTransition(transitionTime); 

    O ejecute la transición al revés llamando a:

     transition.reverseTransition(transitionTime); 

    Consulte la respuesta de Roman para obtener otra solución utilizando la API de animación de propiedades, que no estaba disponible en el momento en que se publicó originalmente esta respuesta.

    Puede utilizar el nuevo Property Animation Api para animación en color:

     int colorFrom = getResources().getColor(R.color.red); int colorTo = getResources().getColor(R.color.blue); ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); colorAnimation.setDuration(250); // milliseconds colorAnimation.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { textView.setBackgroundColor((int) animator.getAnimatedValue()); } }); colorAnimation.start(); 

    Para la compatibilidad hacia atrás con Android 2.x utilice nueve biblioteca de androides de Jake Wharton.

    El método getColor fue obsoleto en Android M, por lo que tiene dos opciones:

    • Si utiliza la biblioteca de soporte, debe reemplazar las llamadas getColor con:

       ContextCompat.getColor(this, R.color.red); 
    • Si no utiliza la biblioteca de soporte, debe reemplazar las llamadas getColor por:

       getColor(R.color.red); 

    Dependiendo de cómo su opinión consigue su color de fondo y cómo usted consigue su color de la blanco hay varias diversas maneras de hacer esto.

    Los dos primeros usan el marco de animación de propiedades de Android .

    Utilice un animador de objetos si:

    • Su vista tiene su color de fondo definido como un valor argb en un archivo xml.
    • Su vista ha tenido previamente su color fijado por view.setBackgroundColor()
    • Su vista tiene su color de fondo definido en un dibujable que NO define ninguna propiedad adicional como el trazo o los radios de la esquina.
    • Su vista tiene su color de fondo definido en un dibujable y desea quitar todas las propiedades adicionales como accidente cerebrovascular o radios de esquina, tenga en cuenta que la eliminación de las propiedades adicionales no se animará.

    El animador de objetos funciona llamando a view.setBackgroundColor que reemplaza el definido drawable a menos que sea una instancia de un ColorDrawable , que rara vez lo es. Esto significa que cualquier propiedad de fondo extra de un dibujable como trazo o esquinas se eliminará.

    Utilice un animador de valor si:

    • Su vista tiene su color de fondo definido en un dibujable que también establece propiedades como los radios de trazo o esquina y desea cambiarlo a un nuevo color que se decide mientras se ejecuta.

    Use una transición dibujable si:

    • Su vista debe cambiar entre dos dibujables que se han definido antes del despliegue.

    He tenido algunos problemas de rendimiento con Transition drawables que se ejecuta mientras estoy abriendo un DrawerLayout que no he sido capaz de resolver, por lo que si se encuentra con cualquier tartamudeo inesperado que podría haber ejecutado en el mismo error que tengo.

    Tendrá que modificar el ejemplo de Value Animator si desea usar un StateLists dibujable o un LayerLists dibujable , de lo contrario se bloqueará en el 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"/> 

    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 de un xml con un AnimatorInflater como XMight hace en Android objectAnimator animar backgroundColor de Layout

    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 utilice 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> 

    Utilice el TransitionDrawable como este:

     final TransitionDrawable background = (TransitionDrawable) view.getBackground(); background.startTransition(300); 

    Puede invertir las animaciones llamando .reverse() en la instancia de animación.

    Hay algunas otras maneras de hacer animaciones, pero estos tres es probablemente el más común. Generalmente utilizo un ValueAnimator.

    Puede crear un animador de objetos. Por ejemplo, tengo un targetView y quiero cambiar tu color de fondo:

     int colorFrom = Color.RED; int colorTo = Color.GREEN; int duration = 1000; ObjectAnimator.ofObject(targetView, "backgroundColor", new ArgbEvaluator(), colorFrom, colorTo) .setDuration(duration) .start(); 

    Si desea una animación de color como esta,

    Introduzca aquí la descripción de la imagen

    Este código le ayudará a:

     float[] hsv; int runColor; int hue = 0; hsv = new float[3]; // Transition color hsv[1] = 1; hsv[2] = 1; anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { hsv[0] = 360 * animation.getAnimatedFraction(); runColor = Color.HSVToColor(hsv); yourView.setBackgroundColor(runColor); } }); anim.setRepeatCount(Animation.INFINITE); anim.start(); 

    Otra manera fácil de lograr esto es realizar un fundido usando AlphaAnimation.

    1. Haz de tu vista un grupo de vistas
    2. Añadir una vista secundaria a ella en el índice 0, con las dimensiones de diseño match_parent
    3. Dé a su niño el mismo fondo que el envase
    4. Cambiar al fondo del contenedor al color de destino
    5. Fade out el niño usando AlphaAnimation.
    6. Retire al niño cuando la animación esté completa (usando un AnimationListener)

    Este es el método que utilizo en una actividad base para cambiar el fondo. Estoy utilizando GradientDrawables generado en código, pero podría ser adaptado para adaptarse.

      protected void setPageBackground(View root, int type){ if (root!=null) { Drawable currentBG = root.getBackground(); //add your own logic here to determine the newBG Drawable newBG = Utils.createGradientDrawable(type); if (currentBG==null) { if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){ root.setBackgroundDrawable(newBG); }else{ root.setBackground(newBG); } }else{ TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{currentBG, newBG}); transitionDrawable.setCrossFadeEnabled(true); if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){ root.setBackgroundDrawable(transitionDrawable); }else{ root.setBackground(transitionDrawable); } transitionDrawable.startTransition(400); } } } 

    Actualización: En caso de que alguien se ejecuta en el mismo problema que encontré, por alguna razón en Android <4.3 con setCrossFadeEnabled(true) causar un efecto indeseable de color blanco por lo que tuve que cambiar a un color sólido <4.3 usando @Roman Minenok ValueAnimator método observado encima.

    Aquí está una función agradable que permite esto:

     public static void animateBetweenColors(final View viewToAnimateItBackground, final int colorFrom, final int colorTo, final int durationInMs) { final ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); colorAnimation.addUpdateListener(new AnimatorUpdateListener() { ColorDrawable colorDrawable = new ColorDrawable(colorFrom); @Override public void onAnimationUpdate(final ValueAnimator animator) { colorDrawable.setColor((Integer) animator.getAnimatedValue()); viewToAnimateItBackground.setBackgroundDrawable(colorDrawable); } }); if (durationInMs >= 0) colorAnimation.setDuration(durationInMs); colorAnimation.start(); } 

    He encontrado que la implementación utilizada por ArgbEvaluator en el código fuente de Android hace mejor trabajo en la transición de colores. Cuando se utiliza HSV, dependiendo de los dos colores, la transición fue saltar a través de demasiados matices para mí. Pero este método no.

    Si está intentando simplemente animar, utilice ArgbEvaluator con ValueAnimator como se sugiere aquí :

     ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); colorAnimation.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { view.setBackgroundColor((int) animator.getAnimatedValue()); } }); colorAnimation.start(); 

    Sin embargo, si usted es como yo y quiere atar su transición con algún gesto del usuario u otro valor pasado de una entrada, el ValueAnimator no es de mucha ayuda (a menos que usted está apuntando para API 22 y arriba, en cuyo caso usted puede utilizar el ValueAnimator.setCurrentFraction() ). Al orientar por debajo de la API 22, envuelva el código encontrado en el código fuente de ArgbEvaluator en su propio método, como se muestra a continuación:

     public static int interpolateColor(float fraction, int startValue, int endValue) { int startA = (startValue >> 24) & 0xff; int startR = (startValue >> 16) & 0xff; int startG = (startValue >> 8) & 0xff; int startB = startValue & 0xff; int endA = (endValue >> 24) & 0xff; int endR = (endValue >> 16) & 0xff; int endG = (endValue >> 8) & 0xff; int endB = endValue & 0xff; return ((startA + (int) (fraction * (endA - startA))) << 24) | ((startR + (int) (fraction * (endR - startR))) << 16) | ((startG + (int) (fraction * (endG - startG))) << 8) | ((startB + (int) (fraction * (endB - startB)))); } 

    Y úsalo como quieras.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.