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.

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

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.

  1. No debe llamar a finishAfterTransition() en onBackPressed() . La Activity super clase ya hará esto por ti.

  2. Debe llamar a requestFeature() antes de super.onCreate() . Solicitar Window.FEATURE_ACTIVITY_TRANSITIONS no es necesario si está utilizando el tema Theme.Material (o similar).

  3. Llamar a setAllowEnterTransitionOverlap(false) y setAllowReturnTransitionOverlap(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.

  4. 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 .

  • Android lectura / escritura de archivos en la unidad USB OTG programatically
  • ¿Qué hay de nuevo en Drawable Tinting en Android L Developer Preview en comparación con la versión anterior?
  • Howto para obtener el camino real con ACTION_OPEN_DOCUMENT_TREE intención. Lollipop API 21 & 22
  • Tema del menú de ActionBar en la última versión de Android L
  • Android L Previsualizar el material denominado Tabs
  • Formato de número de Android 5.0
  • Interfaces perdidas de Android 5.0 Lollipop UsbDevice
  • Android: Control Desplazamiento suave sobre la vista del reciclador
  • El botón de inicio en la barra de acción no funciona en Lollipop
  • Android: windowNoTitle no ocultará la barra de acción con appcompat-v7 21.0.0
  • ¿Cómo realizar una acción de notificación (clic) en la pantalla de bloqueo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.