35

¿Cuál es la mejor manera de ir a una actividad nueva pero hacer que parezca que la actividad se desliza hacia la izquierda y la nueva actividad entra en la pantalla? Estoy usando intenciones para llamar a la nueva actividad, ¿es esa la manera de hacerlo si quiero que la aplicación sea liviana?Nueva actividad en Android "enter from the side"

Para explicar un poco mejor: en mi teléfono Android puedo deslizar la vista con el menú de inicio a la derecha y luego ingresa un flujo de amigos desde la izquierda y se lleva a cabo en la pantalla. Quiero hacerlo en mi aplicación con los botones, es el "deslizamiento" que estoy buscando. ¡Gracias!

Respuesta

88

En android OS 2.1 o posterior, creo que puede utilizar el método OverridePendingTransition() para proporcionar el tipo de transición entre las animaciones de actividades que está buscando.

En primer lugar, defina un par de recursos de animación en /res/anim/. Aquí es uno que se llama right_slide_out.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> 
    <translate 
     android:fromXDelta="0" 
     android:toXDelta="100%p" 
     android:duration="500" 
    /> 
</set> 

Un otro llamado right_slide_in.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> 
    <translate 
     android:fromXDelta="100%p" 
     android:toXDelta="0" 
     android:duration="700" 
    /> 
</set> 

Entonces, cuando usted está comenzando la nueva actividad, utilice el método OverridePendingTransition como en:

startActivity(intent); 
overridePendingTransition (R.anim.right_slide_in, R.anim.right_slide_out); 

Eso debería manejar las animaciones de transición para comenzar ing la actividad.

Por el contrario, cuando esa actividad finaliza y vuelves a la original, es un poco más nublada.

Si tiene algún control de IU que finaliza esa actividad y llama a Activity.finish(), entonces puede simplemente agregar el overridePendingTransition() inmediatamente después de eso.

Para manejar el caso en que el usuario termina la actividad pulsando el botón atrás, use algo como lo siguiente:

@Override 
public void onBackPressed() 
{ 

    this.finish(); 
    overridePendingTransition (R.anim.right_slide_in, R.anim.right_slide_out); 
} 
+0

¡Muchas gracias! Junto con la demostración de la API esto realmente lo hizo. Es fácil de ajustar también. Quiero que mi aplicación "revise" mis actividades como las páginas de un libro, así que esto es un comienzo. Muy bien explicado. – kakka47

+0

Lo hago funcionar, la primera actividad se desliza desde la derecha y la otra actividad se desliza desde la izquierda. Parece que ahora están siempre en la posición Z superior cuando "entran en la pantalla". Quiero que la primera actividad se aleje (fuera de la pantalla) cuando se acerca la otra. Parece que no puedo alcanzarlo ya que el otro está entrando? ¿Puedo hacer una doble anulaciónPendingTransition? ¡Gracias! – kakka47

+1

Dudo que no puedas usar la anulación de la Transición de Pending dos veces para un buen efecto. Si está buscando un efecto de cambio de página, dudo que se pueda hacer con las transiciones de Actividad ya que siempre ejecutan ambas animaciones simultáneamente. Dependiendo de su aplicación, puede considerar no cambiar actividades en absoluto, y en su lugar mantener una actividad y usar múltiples vistas para que pueda animar una vista y la otra, manteniéndolas alineadas para que aparezcan de la manera que desee. Animar vistas es mucho más flexible que lo que puedes controlar con las transiciones de actividad. – mmeyer

3

Sí, usar intents es la manera estándar de comenzar otra actividad, y generalmente hace lo que deslizas que mencionas. p. startActivity (new Intent (this, myNextActivity.class)); lo haré.

+1

en realidad no ... Así que cuando empiezo una nueva actividad, (un poco) choca contra mi vista con un efecto feo ... –

3

Jems es el correcto. De forma predeterminada, obtendrá una animación deslizante al lanzar un nuevo intento.

Si está buscando una animación más personalizada, puede usar overridePendingTransition. Tenga en cuenta que se agregó en API Nivel 5. Consulte esto API demo para el uso de la muestra.

+0

Gracias por el enlace demo de API, a veces es un djungle. Pero entiendo: lo que me parece ser la animación predeterminada al lanzar un nuevo intento, es una especie de desaparición de la actividad existente, y la que yo llamo se expande desde el centro, como desde "dentro de la pantalla". Intenté ambos en un AVD y mi dispositivo. ¿Me estoy perdiendo de algo? – kakka47

+0

kakka47, creo que las transiciones predeterminadas cambiaron a partir de Ice Cream Sandwich, pero podría haber sido con Honeycomb, no estoy seguro. –

+0

¿Dónde está la demostración de API ahora? –

4

Se puede usar un left_slide_out.xml (sólo cambia el toXDelta en right_slide_out.xml de Josh para leer -100% p), para hacer desaparecer la actividad anterior a la izquierda (y también tener la misma duración en ambas animaciones).

0

Hay un poco de confusión en cuanto a lo que son las animaciones de entrada y salida. Para aquellos que todavía están pensando sobre ella, aquí es una plantilla ..

overridePendingTransition(
    enterAnimationForCalledActivity, 
    exitAnimationForCallingActivity 
); 

Esto probablemente se debe limpiar el aire un poco.

Cuestiones relacionadas