Descripción de las transiciones de elementos compartidos exit / reenter
Estoy haciendo una exploración rudimentaria de las transiciones de elementos compartidos en Android L. El ejemplo sencillo que he configurado tiene una vista de imagen que se traduce desde la parte superior de la pantalla a la parte inferior de la pantalla durante las transiciones de actividad y he extendido la duración de la transición Así que puedo ver las cosas funcionando. He tenido dos problemas hasta ahora tratando de entender cómo funciona Shared Element Transitions.
1) Cuando utilice sólo transiciones Enter / Return (Exit / Reenter configurado como null). La transición de entrada está bien, pero cuando se pulsa el botón de retroceso la vista se anima durante un tiempo, se detiene y luego reaparece en la posición final. Parece similar a esta pregunta, pero he establecido todas las transiciones Exist / Reenter a null, así que no estoy seguro de por qué sucede.
- Error después de actualizar la biblioteca de soporte
- Uso de android.support.v7.widget.CardView en mi proyecto (Eclipse)
- CardView no muestra Shadow en Android L
- WifiConfiguration habilita la red en Lollipop
- Comprobar la configuración de notificación de "cuando el dispositivo está bloqueado" de Android
2) Cuando utilice sólo transiciones de salida / reinicio (Enter / Return ajustado en null). No sucede nada, la vista transita por la pantalla como si siguiera una transición de entrada predeterminada (duración de 300 ms), y cuando se pulsa de nuevo, la vista vuelve a su posición original.
¿Cómo utilizo las transiciones de salida / reinicio?
Aquí está mi código:
Activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:src="@drawable/ic_launcher" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Animate!" android:id="@+id/button" android:layout_centerVertical="true" android:layout_alignParentStart="true" /> </RelativeLayout>
Activity_second.xml
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:src="@drawable/ic_launcher" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" />
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setAllowEnterTransitionOverlap(false); getWindow().setAllowReturnTransitionOverlap(false); getWindow().setSharedElementExitTransition(exitTransition()); getWindow().setSharedElementReenterTransition(reenterTransition()); //getWindow().setSharedElementExitTransition(null); //getWindow().setSharedElementReenterTransition(null); setContentView(R.layout.activity_main); final View iView = findViewById(R.id.imageView); iView.setTransitionName("image"); final Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); ActivityOptions options = ActivityOptions .makeSceneTransitionAnimation(MainActivity.this, iView, "image"); startActivity(intent, options.toBundle()); } }); } private Transition exitTransition() { ChangeBounds bounds = new ChangeBounds(); bounds.setInterpolator(new BounceInterpolator()); bounds.setDuration(2000); return bounds; } private Transition reenterTransition() { ChangeBounds bounds = new ChangeBounds(); bounds.setInterpolator(new OvershootInterpolator()); bounds.setDuration(2000); return bounds; } }
SecondActivity.java
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setAllowEnterTransitionOverlap(false); getWindow().setAllowReturnTransitionOverlap(false); //getWindow().setSharedElementEnterTransition(enterTransition()); //getWindow().setSharedElementReturnTransition(returnTransition()); getWindow().setSharedElementEnterTransition(null); getWindow().setSharedElementReturnTransition(null); setContentView(R.layout.activity_second); final View iView = findViewById(R.id.imageView2); iView.setTransitionName("image"); } @Override public void onBackPressed() { super.onBackPressed(); finishAfterTransition(); } private Transition enterTransition() { ChangeBounds bounds = new ChangeBounds(); bounds.setDuration(2000); return bounds; } private Transition returnTransition() { ChangeBounds bounds = new ChangeBounds(); bounds.setInterpolator(new DecelerateInterpolator()); bounds.setDuration(2000); return bounds; } }
- Cómo implementar la pantalla Detalles de contacto como Lollipop
- Styling ActionMode ActionBar en Android 5.0 Lollipop (con AppCompat)
- SDK 5.0 RecyclerView no se puede instanciar
- Androide: Elevación no respetada a través de FragmentTransactions
- Configuración del color del encabezado de la aplicación en la vista general (aplicaciones recientes)
- Diseño de material Android Inline Datepicker issue
- ¿Hay una manera de compartir un mismo LayoutManager entre múltiples RecyclerViews anidados
- No se puede hacer JNI llamar desde c ++ a java en android lollipop usando jni
Como recuerdo, hay un error en L que hace que la transición de retorno de elemento compartido se interrumpa si tarda más que la duración de transición de reingreso. Si ajusta la duración de transición de reingreso (en la actividad de llamada), debería solucionar el problema de interrupción hasta que el error se corrija en MR1.
Las transiciones de salida y reinicio son para ejecutar cosas antes de que se permita que transcurra el elemento compartido. Por ejemplo, si desea levantar su elemento compartido antes de transferirlo, esto se haría en la transición de salida del elemento compartido. El reingreso se usaría para hacer lo contrario – soltar la vista después de que fue transferido de nuevo. La mayoría de las aplicaciones no lo necesitan, pero está allí para el raro que lo hace.
-
No debe llamar a
finishAfterTransition()
enonBackPressed()
. LaActivity
super clase ya hará esto por ti. -
Debe llamar a
requestFeature()
antes desuper.onCreate()
. SolicitarWindow.FEATURE_ACTIVITY_TRANSITIONS
no es necesario si está utilizando el temaTheme.Material
(o similar). -
Llamar a
setAllowEnterTransitionOverlap(false)
ysetAllowReturnTransitionOverlap(false)
es redundante aquí. Estos determinan la superposición de las transiciones de contenido de la ventana de la actividad … no afectan en absoluto a las transiciones de contenido de elementos compartidos de la actividad. -
Rara vez es necesario establecer salidas y reingresar transiciones de elementos compartidos. Casi siempre desea utilizar las transiciones de entrada y devolución en su lugar. Si establece sólo la salida y vuelve a introducir las transiciones de elemento compartidas y deja las transiciones de elementos enter y retorno compartidas nulas, la actividad llamada no tendrá forma de saber cómo animar los elementos compartidos cuando comience la transición y la animación parezca estar rota .
- Cómo enviar una cadena utilizando NFC desde un teléfono Windows 8 a un dispositivo Android
- ActionBarActivity botón de retroceso no estallar de backstack