Animación de escala de Android a la vista

Quiero usar ScaleAnimation (programmatic not in xml) para cambiar la altura para ver de 0 a 60% de la altura de los padres. El ancho de vista es constante y es 50px. La vista está vacía, solo se establece el color de fondo.

¿Alguien puede darme el código de scaleAnim usando ScaleAnimation del código?

    ScaleAnimation scaleAnim = new ScaleAnimation(...); 

ver antes y después de la animación

ver antes y después de la animación .Gracias

Aquí hay un fragmento de código para hacer exactamente eso.

 public void scaleView(View v, float startScale, float endScale) { Animation anim = new ScaleAnimation( 1f, 1f, // Start and end values for the X axis scaling startScale, endScale, // Start and end values for the Y axis scaling Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling anim.setFillAfter(true); // Needed to keep the result of the animation anim.setDuration(1000); v.startAnimation(anim); } 

El constructor ScaleAnimation utilizado aquí tiene 8 argumentos, 4 relacionados con el manejo de la escala X, que no nos importa (1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...) .

Los otros 4 argumentos son para la escala Y que nos importa.

startScale, endScale – En tu caso, 0f, 0.6f .

Animation.RELATIVE_TO_SELF, 1f : especifica dónde se contrae la contracción de la vista (lo que se conoce como pivote en la documentación). Aquí, establecemos el valor de flotación en 1f porque queremos que la animación empiece a boost la barra desde la parte inferior. Si quisiéramos que creciera hacia abajo desde la parte superior, 0f .

Finalmente, e igualmente importante, es la llamada a anim.setFillAfter(true) . Si desea que el resultado de la animación permanezca después de que finalice la animación, debe ejecutar esto en el animador antes de ejecutar la animación.

Entonces en tu caso, puedes hacer algo como esto:

 View v = findViewById(R.id.viewContainer); scaleView(v, 0f, .6f); 

prueba este código para crear una animación de escala sin usar xml

 ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

En XML, esto es lo que uso para lograr el mismo resultado. Puede ser que esto sea más intuitivo.

scale_up.xml

     

scale_down.xml

     

Ver la animación en el eje X es de 1.0 -> 1.0 que significa que no tiene ninguna escala en esa dirección y se mantiene en todo el ancho, mientras que en el eje Y obtiene 0.0 -> 1.0 escala, como se muestra en el gráfico en la pregunta. Espero que esto ayude a alguien.

Algunos pueden querer saber el código de Java como vemos uno solicitado.

Coloque los archivos de animación en la carpeta anim y luego cargue y configure archivos de animación como.

 Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down); ImagView v = findViewById(R.id.your_image_view); v.startAnimation(scaleDown); 

Cambiar el tamaño utilizando los métodos de ayuda y los manejadores de inicio-repetición-final como este:

 resize( view1, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 150, null, null, null); return null; } 

Métodos de ayuda:

 /** * Resize a view. */ public static void resize( View view, float fromX, float toX, float fromY, float toY, float pivotX, float pivotY, int duration) { resize( view, fromX, toX, fromY, toY, pivotX, pivotY, duration, null, null, null); } /** * Resize a view with handlers. * * @param view A view to resize. * @param fromX X scale at start. * @param toX X scale at end. * @param fromY Y scale at start. * @param toY Y scale at end. * @param pivotX Rotate angle at start. * @param pivotY Rotate angle at end. * @param duration Animation duration. * @param start Actions on animation start. Otherwise NULL. * @param repeat Actions on animation repeat. Otherwise NULL. * @param end Actions on animation end. Otherwise NULL. */ public static void resize( View view, float fromX, float toX, float fromY, float toY, float pivotX, float pivotY, int duration, Callable start, Callable repeat, Callable end) { Animation animation; animation = new ScaleAnimation( fromX, toX, fromY, toY, Animation.RELATIVE_TO_SELF, pivotX, Animation.RELATIVE_TO_SELF, pivotY); animation.setDuration( duration); animation.setInterpolator( new AccelerateDecelerateInterpolator()); animation.setFillAfter(true); view.startAnimation( animation); animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (start != null) { try { start.call(); } catch (Exception e) { e.printStackTrace(); } } } @Override public void onAnimationEnd(Animation animation) { if (end != null) { try { end.call(); } catch (Exception e) { e.printStackTrace(); } } } @Override public void onAnimationRepeat( Animation animation) { if (repeat != null) { try { repeat.call(); } catch (Exception e) { e.printStackTrace(); } } } }); } 
 public void expand(final View v) { ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0); scaleAnimation.setDuration(250); scaleAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { v.setVisibility(View.INVISIBLE); } @Override public void onAnimationRepeat(Animation animation) { } }); v.startAnimation(scaleAnimation); } public void collapse(final View v) { ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0); scaleAnimation.setDuration(250); scaleAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { v.setVisibility(View.VISIBLE); } @Override public void onAnimationRepeat(Animation animation) { } }); v.startAnimation(scaleAnimation); }