¿Cómo animar una vista en Android y mantenerla en la nueva posición / tamaño?

80

Actualmente tengo una vista en mi aplicación de Android y la vista está reproduciendo una animación de cuadro. Quiero animar la vista para aumentar su tamaño al 150%. Cuando le aplico una animación de escala y se completa la animación de escala, quiero que el espectador permanezca en ese nuevo tamaño durante el resto del ciclo de vida de la actividad. Desafortunadamente, en este momento, cuando se completa la animación de ampliación, la vista vuelve al tamaño original. ¿Cómo puedo hacer que se mantenga la nueva transformación animada?

Estoy usando

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

¡Gracias!

justinl
fuente

Respuestas:

149

Asegúrese de agregar los siguientes atributos al elemento raíz en su animación xml:

android:fillAfter="true" 
android:fillEnabled="true"
Qlimax
fuente
7
Ésta es la verdadera respuesta. El OP debería cambiar esto para que sea la respuesta aceptada. ¡¡Gracias Qlimax !! (PD: esto no está documentado en la sección "Animación" de la Guía para desarrolladores, solo está documentado en los javadocs para la clase de animación. ¡Qué documentación tan pobre!)
Neil Traft
7
donde poner este codigo? en <set ...></set>o en etiquetas de animación ( translate| rotate| scale)?
xxxxxxxxxadfas
5
como se menciona a continuación, debe agregarlo al parámetro establecido
cV2
3
Esto no funciona. Quiero que el tamaño real de la vista cambie con la animación. Solo cambia el contenido. Estoy cambiando la escala Y de 1.0 a 0.0 y la animación ocurre pero deja un espacio vacío donde solía estar la vista. Además, probé View.GONE pero eso encaja las otras vistas en el espacio vacío. Necesito que las otras vistas sigan el tamaño de la vista de escala mientras se reduce. ¿Cómo hacer que funcione?
Sudhanshu
1
Cualquier otra persona que lea esto debe tener en cuenta que fillAftersolo mantendrá los píxeles de la vista mientras que la vista real seguirá en la posición inicial. Necesita configurar manualmente LayoutParamssu vista probablemente en onAminationEnd (oyente).
Muhammad Babar
52

intente construir la animación a partir del código y configurar las propiedades de esta manera

anim.setFillEnabled(true);
anim.setFillAfter(true);
Mina Samy
fuente
pero se crea un nuevo problema, recibo un evento táctil. stackoverflow.com/questions/4728908/…
W00di
32

si desea poner su animación en un xml , es posible que necesite esto para ayudar:

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

por favor también aprecie la otra respuesta, me ayudó :) ¡buena suerte!

cV2
fuente
22

Hoy en día se ha vuelto muy fácil:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(En este fragmento se ha utilizado ViewPropertyAnimator).

También es posible agregar muchas otras opciones.

La vista se ubicará en la nueva posición.

Andrés
fuente
Esto debería publicarse como trending topic
Kotik_o
2

EDITAR: La respuesta de Qlimax es mejor, pero dado que el OP no ha regresado para cambiar la marca de verificación y no puedo eliminar una respuesta aceptada, la copiaré aquí: simplemente configure fillAfter = true fillEnabled = true

Mi respuesta original (que funciona, pero es ligeramente ridícula en comparación) es la siguiente:

Para que las cosas funcionen como se esperaba después de la animación, al menos de acuerdo con este hilo , tendrá que escribir un onAnimationEndcontrolador, y allí, ajustar manualmente los límites "reales" (pre-transformación) de su vista para que coincidan con el resultado final de la animación de escala.

Walter Mundt
fuente
Hola Walter. He sobrescrito el onAnimationEnd, pero no sé cómo ajustar los límites "reales" de la vista para que coincidan con la escala de la animación. Sé qué dp exacto quiero que termine, pero no puedo encontrar la función "setWidth ()" o "setHeight ()".
justinl
1
Creo que se almacenan en LayoutParams. Deberías poder hacerlo view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (La última llamada es necesaria para informar al árbol de vistas que debe recalcularse).
Walter Mundt
2
Esta es una forma increíblemente indirecta de hacer las cosas. Todo lo que hay que hacer es establecer atributos android:fillEnabledy android:fillAfterque ambos sean verdaderos.
Neil Traft
1

En realidad, como la animación que está utilizando parece estar incrustada en el marco de Android, no estoy seguro de que pueda cambiar nada en ella.
Sin embargo, puede crear su propia animación siguiendo el ejemplo de la documentación . Y tendrás que poner android: fillAfter = "true" si quieres que la escala se mantenga después del final de la animación.

Sephy
fuente
2
scaleUp150 es una animación personalizada que escribí en xml (aunque es extremadamente básica). Puse android: fillAfter = "true" dentro de la animación, pero todavía vuelve al tamaño original: S
justinl
1

Ponga android: fillAfter = "true" en la etiqueta SET, ya que ponerlos en la etiqueta de animación los limita a los "parámetros de transición" o "durante / mientras se animan parámetros". Los parámetros en el SET aplicarán la transformación que está buscando después de que termine las animaciones.

takrishna
fuente