Evite completamente que las transiciones de actividad interfieran con las transiciones de elementos compartidos:
En la actividad existente, llame a getWindow (). SetExitTransition (null);
En la actividad de entrada, llame a getWindow (). SetEnterTransition (null);
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:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
//noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
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):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
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í:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
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.