Hay dos enfoques que puede usar que conozco para evitar que la barra de navegación / estado se anime durante la transición:
Enfoque n. ° 1: excluir la barra de estado y la barra de navegación de la transición predeterminada de salida / entrada de transición de la ventana
La razón por la que la barra de navegación / estado se desvanece durante la transición es porque, de manera predeterminada, todas las vistas no compartidas (incluidos los fondos de la barra de navegación / estado) se desvanecerán / se desvanecerán en sus llamadas / Actividades llamadas respectivamente una vez que comience la transición . Sin embargo, puede evitar esto fácilmente excluyendo los fondos de la barra de navegación / estado de la Fade
transición predeterminada de salida / entrada de la ventana . Simplemente agregue el siguiente código a los onCreate()
métodos de sus Actividades :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
Esta transición también podría declararse en el tema de la actividad utilizando XML (es decir, en su propio res/transition/window_fade.xml
archivo):
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</fade>
Enfoque n. ° 2: agregue la barra de estado y la barra de navegación como elementos compartidos
Este enfoque se basa en la respuesta de klmprt, que casi funcionó para mí ... aunque aún necesitaba hacer un par de modificaciones.
En mi actividad de llamadas, utilicé el siguiente código para iniciar la actividad:
View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);
List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));
Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity,
pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);
Hasta ahora, esto es esencialmente lo mismo que Klmprt sugirió en su respuesta. Sin embargo, también necesitaba agregar el siguiente código en el onCreate()
método de mi actividad llamada para evitar que la barra de estado y la barra de navegación "parpadeen" durante la transición:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
// Postpone the transition until the window's decor view has
// finished its layout.
postponeEnterTransition();
final View decor = getWindow().getDecorView();
decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
decor.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}
Agregar la barra de estado y los fondos de la barra de navegación como elementos compartidos los forzará a dibujar sobre la transición predeterminada de salida / entrada de la ventana, lo que significa que no se desvanecerán durante la transición. Se puede encontrar más discusión sobre este enfoque en esta publicación de Google+ .
Evite completamente que las transiciones de actividad interfieran con las transiciones de elementos compartidos:
Desde https://stackoverflow.com/a/34907685/967131
Sospecho que esto puede tener efectos secundarios, pero no estoy seguro. Es muy simple y funciona sin embargo.
Evitar que elementos específicos parpadeen:
Comencé con la respuesta de Alex Lockwood e hice un poco de experimentación para intentar que funcionara. El núcleo es correcto, aunque no necesitaba el código que sugiere para la Actividad receptora, pero encontré algunos problemas al llamarlo en un Fragmento (en lugar de una Actividad) y al establecer una barra de herramientas como la barra de acción.
Oh, lo del fragmento? Vi muchos comentarios que tratar de recuperar referencias a la barra de estado y la barra de navegación eran nulos. A mí también me pasó lo mismo, hasta que me di cuenta de que no los encontraría en el diseño del Fragmento ... estaban por encima de ese nivel. Por lo tanto, el siguiente código para obtener la vista de decoración de la Actividad y buscar eso. Luego los encontré sin problema.
Al final, desarrollé este método de utilidad:
Tenga en cuenta R.string.transition_appbarlayout y R.id.appbarlayout . Estas ID son arbitrarias, siempre que coincidan con lo que usa su código. En mi XML, diseño la barra de acción personalizada de la siguiente manera (editado a lo esencial):
Si no usa una barra de herramientas como esta, esa parte se puede eliminar del método de utilidad.
Entonces lo llamarías en tu Fragmento así:
Usando los valores que desee, siempre que coincida con su XML.
Esto evita que la barra de estado, la barra de herramientas y la barra de navegación (botones atrás / inicio / aplicaciones recientes) parpadeen durante la transición. El resto de la transición de la actividad es normal.
En mi caso, el tema de nuestra aplicación tiene un
android:windowBackground
color azul. Esto provoca un destello azul en la transición, lo cual es bastante frustrante. Pero en lugar de hacer un cambio que afecte a toda la aplicación de esa manera, por ahora voy con la primera opción, rápida y sucia.fuente
Necesitas compartirlos en
ActivityOptions.makeSceneTransitionAnimation.
P.ej:
(disculpe el psuedo; no tengo el valor exacto de android.R.id en la mano)
Puede ejecutar una transición apropiada después de haber compartido las vistas.
fuente
Hasta donde entiendo, esto es causado por la superposición de la transición de actividad. Para superar este problema, he utilizado los siguientes valores en los
onCreate()
métodos de ambas actividades:fuente
Acabo de tener este mismo problema, y parece que a las respuestas les falta una pieza crítica del rompecabezas. Recuerde que en una transición de elemento compartido, todo sucede en la Actividad de destino .
Para eliminar el efecto intermitente, simplemente agregue lo siguiente a la actividad que se llama:
¡Esto debería solucionar tu problema!
fuente
getWindow().setEnterTransition(null);
en la transición de entrada eliminó la superposición blanca para mí.fuente
Así es como lo hice. Comparto tanto el
Status Bar
comoNavigation Bar
elSharedElementTransition
junto con unImageView
:fuente