Fragments ViewPager – Transitions d'éléments partagés

Une application que je développe affiche une grille d'images. Lorsque vous appuyez sur une image, elle entre dans la vue des détails. La vue des détails contient un ViewPager qui vous permet de glisser entre chaque image dans la grille. Cela se fait en passant une liste de chemins (contenant chaque image dans la grille), ainsi qu'un décalage de l'image qui a été taper afin que ViewPager puisse être configuré pour montrer cette page initialement.

Quelle est la meilleure façon d'avoir une transition d'élément partagé dans le Fragment de la page de décalage actuelle dans le ViewPager? L'image de la grille (RecyclerView) devrait se développer dans l'image en plein écran dans la page actuelle. J'ai vu la possibilité de retarder et de reprendre les transitions d'activité, de sorte que l'application attendrait d'afficher la transition d'élément partagé jusqu'à ce que l'image soit chargée à partir du disque. Mais je veux pouvoir l'animer vers la page correcte dans le pager de la vue, et aussi quitter la page actuelle lorsque l'utilisateur retourne (car vous pouvez glisser entre les pages). Si vous passez une page différente maintenant, la page initiale est ce qui anime de nouveau dans la grille.

  • Existe-t-il un moyen de revenir à Typeface.SERIF dans StaticLayout?
  • Spécification d'un filtre d'intention SEND (partage) pour un service
  • GetExternalFilesDir alternative dans Android 2.1
  • Android Floating activity with dismiss over swipe
  • Comment rechercher des contacts avec une adresse (FORMATTED_ADDRESS) avec une requête?
  • Autorisation d'écrire sur la carte SD
  • Actuellement, je cite chaque image dans les Fragments du pager de vue avec une transitionName au format "image_ [index]". Lorsque je démarre l'activité de détails, j'utilise le même nom de transition avec l'indice étant le décalage.

    En ce qui concerne cela, je me demandais également comment faire fonctionner les ondulations avec de longues presses. Lorsque vous modifiez l'état activé d'une vue, il semble annuler l'ondulation. Je veux un effet similaire à celui de Gmail, où l'ondulation recommence et finit rapidement après la fin d'une longue pression et déclenche l'état activé.

  • Comment utiliser les vues d'instantané d'élément partagé lors d'une transition d'activité?
  • Comment postuler la transition d'entrée d'un Fragment dans Android Lollipop?
  • Les éléments partagés Android lollipop transition clignotent / flash
  • Activité Erreur de transition, ne peut pas résoudre le symbole '@ transition / exploded'
  • 2 Solutions collect form web for “Fragments ViewPager – Transitions d'éléments partagés”

    D'après ce que je peux dire (et corrigez-moi si je me trompe), ce que vous essayez d'atteindre, c'est essentiellement quelque chose comme cela: MainActivity que vous avez une activité MainActivity , un DetailsActivity et un ensemble arbitraire d'images. MainActivity affiche l'ensemble des images dans une grille et DetailsActivity affiche le même ensemble d'images dans un ViewPager horizontal. Lorsque l'utilisateur sélectionne une image dans MainActivity , cette image doit passer de sa position dans la grille à la page correcte dans le ViewPager de la deuxième activité.

    Le problème que nous voulons résoudre est «que faire si l'utilisateur change de pages dans la fonction DetailsActivity »? Si cela se produit, nous voulons modifier l'image partagée qui sera utilisée pendant la transition de retour. Par défaut, la structure de transition d'activité utilisera l'élément partagé qui a été utilisé lors de la transition d'entrée … mais la page de la téléavertisseur d'affichage a changé, donc, évidemment, nous voulons en quelque sorte remplacer ce comportement. Pour ce faire, nous devrons configurer SharedElementCallback dans les MainActivity onCreate() MainActivity et DetailsActivity et surpasser la méthode onMapSharedElements() comme onMapSharedElements() :

     private final SharedElementCallback mCallback = new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { if (mCurrentImagePosition != mOriginalImagePosition) { View sharedView = getImageAtPosition(mCurrentImagePosition); names.clear(); sharedElements.clear(); names.add(sharedView.getTransitionName()); sharedElements.put(sharedView.getTransitionName(), sharedView); } } /** * Returns the image of interest to be used as the entering/returning * shared element during the activity transition. */ private View getImageAtPosition(int position) { // ... } }; 

    Pour une solution plus complète, j'ai créé un exemple de projet sur GitHub qui atteindra cet effet (il y a trop de code pour publier dans une seule réponse StackOverflow).

    Je suppose que vous utilisez Fragment Transitions et que vous n'êtes pas animé entre les activités. Il est possible dans les Transitions d'activité et les Transitions de fragments, mais le code spécifique est un peu différent. Le report n'est pas disponible sur Fragment Transitions.

    L'addSharedElement prend un deuxième paramètre. Si vous connaissez le nom spécifique du fragment cible lorsque vous l'appelez, vous pouvez simplement choisir le nom dans le fragment de détails à utiliser. Si vous ne le faites pas, vous pouvez choisir n'importe quel nom que vous voulez et le remapper avec le paramètre SharedElementCallback défini sur le Fragment.

     fragment.setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { sharedElements.put("detailView", mTargetDetailView); } }); 

    Si cela ne correspond pas sur le chemin du retour, le même appel est fait pour le remapper. Ce sera probablement dans le fragment d'appel et le fragment appelé – sur le fragment d'appel, vous utilisez setExitSharedElementCallback. Je m'attends à ce que ce soit le cas dans votre application.

    De même, dans les Transitions d'activité, vous définissez le même SharedElementCallback et utilisez le même mappage, mais vous le faites sur l'activité à la place.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.