web-dev-qa-db-fra.com

Écran clignotant sur la transition d’image entre activités

J'ai mis en place une transition d'image entre deux activités en utilisant les nouveaux éléments partagés de Lollipop. Cela fonctionne mais je reçois un étrange clignotement blanc sur tout l'écran pendant la transition et je ne trouve pas comment le supprimer. Voici un exemple:Status bar also blinking

Voici comment la deuxième activité est lancée

public static void launch(
            @NonNull Activity activity, @NonNull View transitionView, Game game) {
        ActivityOptionsCompat options =
                ActivityOptionsCompat.makeSceneTransitionAnimation(
                        activity, transitionView, game.gameFullId);
        Intent intent = new Intent(activity, ListImportationLoginActivity.class);
        intent.putExtra(INTENT_EXTRA_GAME, retailer);
        ActivityCompat.startActivity(activity, intent, options.toBundle());
    }

Puis dans onCreate:

ViewCompat.setTransitionName(mLogoView, mGame.gameFullId);  

Et le fichier de thème:

<resources>
    <style name="Theme.MyApp.NoActionBar" parent="Theme.MyApp.NoActionBar.Base">
        <item name="Android:windowContentTransitions">true</item>
        <item name="Android:windowAllowEnterTransitionOverlap">true</item>
        <item name="Android:windowAllowReturnTransitionOverlap">true</item>
        <item name="Android:windowSharedElementEnterTransition">@Android:transition/move</item>
        <item name="Android:windowSharedElementExitTransition">@Android:transition/move</item>
    </style>
</resources>  

Merci de votre aide

48
Leguman

Sur l'activité existante, appelez getWindow().setExitTransition(null);

Pour l'activité entrante, appelez getWindow().setEnterTransition(null);

Cela évitera la disparition progressive de l'activité en sortie et celle de l'activité entrante, ce qui supprime l'effet clignotant apparent.

33
Kevin Lee

Le "clignotement blanc" que vous voyez est le résultat des deux activités animées par alpha dans et hors de la transition: lorsque l'activité A commence l'activité B, l'activité A disparaît et l'activité B apparaît en fondu.

Si vous souhaitez empêcher la barre d'état et/ou la barre de navigation de s'estomper pendant la transition (et ainsi réduire légèrement l'effet de "clignotement"), vous pouvez regarder cet article .

18
Alex Lockwood

J'ai résolu ce problème en changeant la couleur de fond de mon thème par défaut, en espérant que cela puisse encore aider quelqu'un à gagner du temps.

<item name="Android:windowBackground">@color/black</item>
<item name="Android:colorBackground">@color/black</item>
12
Webdma

Faire une méthode dans l'aide comme

public static Transition makeEnterTransition() {
    Transition fade = new Fade();
    fade.excludeTarget(Android.R.id.navigationBarBackground, true);
    fade.excludeTarget(Android.R.id.statusBarBackground, true);
    return fade;
}

Exécutez-le dans l'activité que vous commencez comme ceci

getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());

Source https://github.com/alexjlockwood/custom-Lollipop-transitions/

10
Rzodkiewka

J'ai eu des problèmes de clignotement similaires et j'ai essayé plusieurs des exemples mentionnés ici, mais pour moi cela n'a pas résolu les problèmes. Ce qui a fonctionné pour moi a été de changer le fond de la fenêtre du deuxième thème d'activité en transparent. (@Webdma utilisait du noir, mais dans mon cas, l'écran était noir au lieu de blanc)

    <item name="Android:windowBackground">@Android:color/transparent</item>
3
Kasium

J'ai eu un problème similaire ... J'ai résolu les problèmes de barre d'état clignotante et de barre de navigation en les excluant de la transition, comme suggéré par @ Alex, mais l'écran clignotait toujours lors du basculement entre les activités. Quand j'ai enlevé le "Finish ();" instruction après startActivity (); L’écran a cessé de clignoter ... Peut-être à cause de la fermeture de l’appel. J'espère que ça aide quelqu'un.

2
Neanderthal

Quelques réponses utiles ci-dessus… Pour autant que je sache, cela est dû au chevauchement des transitions d'activité. Pour résoudre ce problème, j'ai utilisé les valeurs suivantes dans les méthodes onCreate() des deux activités:

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
2
Randeep

Ajoutez ces codes dans onCreate des deux activités où vous effectuez des éléments de transition.

   Fade fade = new Fade();
        View decor = getWindow().getDecorView();
        fade.excludeTarget(decor.findViewById(R.id.action_bar_container),true);
        fade.excludeTarget(Android.R.id.statusBarBackground,true);
        fade.excludeTarget(Android.R.id.navigationBarBackground,true);

        getWindow().setEnterTransition(fade);
        getWindow().setExitTransition(fade);

Cela exclura l’animation de la barre de navigation et de la barre d’état, donc plus de clignotement

1
Eldhopj

Dans ma situation, la deuxième activité ne comportait pas de barre d'état définie dans le thème d'activité avec cette balise. 

<item name="Android:windowFullscreen">true</item>

Comme il n'était pas obligatoire de masquer la barre d'état en mode portrait, j'ai supprimé cette balise et masqué/affiché manuellement la barre d'état en cas de besoin et le clignotement a disparu. 

1
JDenais

Les éléments apparaissent et disparaissent en fondu à moins que vous ne spécifiiez explicitement qu'ils sont identiques pour les deux activités. Cela inclut le statut et la barre de navigation.

Dans votre cas particulier, j'ajouterais la barre d'outils et ces deux vues à la liste des éléments partagés:

List<Pair> viewPairs = new ArrayList<>();
viewPairs.add(Pair.create(findViewById(Android.R.id.statusBarBackground), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
viewPairs.add(Pair.create(findViewById(Android.R.id.navigationBarBackground), Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
// Add your views...

Pair[] array = new Pair[viewPairs.size()];
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), viewPairs.toArray(array)).toBundle();
// ...

ActivityCompat.startActivity(activity, intent, options.toBundle());
0
gatti