À ma connaissance, vous pouvez utiliser deux approches pour empêcher l'animation de la barre de navigation / d'état pendant la transition:
Approche n ° 1: exclure la barre d'état et la barre de navigation de la transition par défaut de sortie / entrée de fondu de la fenêtre
La raison pour laquelle la barre de navigation / d'état s'estompe pendant la transition est que, par défaut, toutes les vues non partagées (y compris les arrière-plans de la barre de navigation / d'état) disparaîtront dans vos activités d'appel / appelées respectivement une fois la transition commencée . Cependant, vous pouvez facilement contourner ce problème en excluant les arrière-plans de la barre de navigation / d'état de la Fade
transition sortie / entrée par défaut de la fenêtre . Ajoutez simplement le code suivant aux onCreate()
méthodes de vos activités :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
Cette transition peut également être déclarée dans le thème de l'activité en utilisant XML (c'est-à-dire dans votre propre res/transition/window_fade.xml
fichier):
<?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>
Approche n ° 2: ajouter la barre d'état et la barre de navigation en tant qu'éléments partagés
Cette approche s'appuie sur la réponse de klmprt, qui a presque fonctionné pour moi ... même si j'avais encore besoin d'apporter quelques modifications.
Dans mon activité d'appel, j'ai utilisé le code suivant pour démarrer l'activité:
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);
Jusqu'à présent, c'est essentiellement la même chose que celle suggérée par klmprt dans sa réponse. Cependant, j'avais également besoin d'ajouter le code suivant dans la onCreate()
méthode de mon activité appelée afin d'empêcher la barre d'état et la barre de navigation de "clignoter" pendant la transition:
@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;
}
});
}
L'ajout de la barre d'état et des arrière-plans de la barre de navigation en tant qu'éléments partagés les forcera à être dessinés au-dessus de la transition de fondu sortie / entrée par défaut de la fenêtre, ce qui signifie qu'ils ne se faneront pas pendant la transition. Vous trouverez plus d'informations sur cette approche dans ce post Google+ .
Empêchez complètement les transitions d'activité d'interférer avec les transitions d'éléments partagés:
Sur https://stackoverflow.com/a/34907685/967131
Je soupçonne que cela peut avoir des effets secondaires, mais je ne sais pas avec certitude. C'est très simple et fonctionne bien.
Empêcher des éléments spécifiques de clignoter:
J'ai commencé avec la réponse d'Alex Lockwood et j'ai fait pas mal d'expérimentation pour essayer de la faire fonctionner. Le cœur de celui-ci est correct, même si je n'avais pas besoin du code qu'il suggère pour l'activité de réception, mais j'ai rencontré des problèmes en l'appelant dans un fragment (au lieu d'une activité) et en définissant une barre d'outils comme barre d'action.
Oh, la chose Fragment? J'ai vu beaucoup de commentaires qui essayaient de récupérer des références à la barre d'état et à la barre de navigation étaient nulles. La même chose m'est arrivée aussi, jusqu'à ce que je réalise que je ne les trouverais pas dans la mise en page du Fragment ... elles étaient au-dessus de ce niveau. Par conséquent, le code ci-dessous pour obtenir la vue décorative de l'activité et la rechercher. Ensuite, je les ai trouvés sans problème.
Au final, j'ai développé cette méthode utilitaire:
Remarque R.string.transition_appbarlayout et R.id.appbarlayout . Ces ID sont arbitraires, tant qu'ils correspondent à ce que votre code utilise. Dans mon XML, je mets en page la barre d'actions personnalisée comme ceci (éditée jusqu'à l'essentiel):
Si vous n'utilisez pas une barre d'outils comme celle-ci, cette partie peut être supprimée de la méthode utilitaire.
Ensuite, vous l'appelleriez dans votre Fragment comme ceci:
En utilisant les valeurs que vous voulez, tant qu'elles correspondent à votre XML.
Cela empêche la barre d'état, la barre d'outils et la barre de navigation (boutons retour / accueil / applications récentes) de clignoter pendant la transition. Le reste de la transition d'activité est normal.
Dans mon cas, notre thème d'application a un
android:windowBackground
bleu. Cela provoque un flash bleu dans la transition, ce qui est assez frustrant. Mais plutôt que de faire un changement qui affecte toute l'application comme ça, pour l'instant je vais avec la première option, rapide et sale.la source
Vous devez les partager dans
ActivityOptions.makeSceneTransitionAnimation.
Par exemple:
(excusez le psuedo; je n'ai pas la valeur exacte android.R.id sous la main)
Vous pouvez exécuter une transition appropriée après avoir partagé les vues.
la source
Autant que je sache, cela est dû au chevauchement des transitions d'activités. Pour surmonter ce problème, j'ai utilisé les valeurs suivantes dans les
onCreate()
méthodes des deux activités:la source
J'ai juste eu ce même problème, et les réponses semblent manquer une pièce essentielle du puzzle. N'oubliez pas que lors d'une transition d'élément partagé, tout se passe dans l' activité de destination .
Pour supprimer l'effet de clignotement, ajoutez simplement ce qui suit à l'activité appelée:
Cela devrait résoudre votre problème!
la source
getWindow().setEnterTransition(null);
sur la transition d'entrée a supprimé la superposition blanche pour moi.la source
Voici comment je l'ai fait. Je partage à la fois le
Status Bar
et leNavigation Bar
dans leSharedElementTransition
avec unImageView
:la source