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