studio programacion herramientas fundamentos con avanzado aplicaciones android animation

programacion - Animación de escala de Android a la vista



manual de android en pdf (4)

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?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layContainer > <View android:layout_width="50px" android:layout_height="fill_parent" android:id="@+id/viewContainer" android:background:"#00f00" /> </LinearLayout> ScaleAnimation scaleAnim = new ScaleAnimation(...);

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 aumentar 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);


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(); } } } }); }


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

scale_up.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="200" android:fromXScale="1.0" android:fromYScale="0.0" android:pivotX="50%" android:pivotY="100%" android:toXScale="1.0" android:toYScale="1.0" /> </set>

scale_down.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="200" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="100%" android:toXScale="1.0" android:toYScale="0.0" /> </set>

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);


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);