TL; DR: Je recherche un exemple de travail complet de ce que j'appellerai le scénario "l'animation à trois fragments de Gmail". Plus précisément, nous voulons commencer par deux fragments, comme ceci:
Lors d'un événement d'interface utilisateur (par exemple, en tapant sur quelque chose dans le fragment B), nous voulons:
- Fragment A pour glisser hors de l'écran vers la gauche
- Fragment B pour glisser vers le bord gauche de l'écran et rétrécir pour reprendre la place libérée par le fragment A
- Fragment C à glisser depuis le côté droit de l'écran et à occuper la place libérée par le Fragment B
Et, en appuyant sur le bouton BACK, nous voulons que cet ensemble d'opérations soit inversé.
Maintenant, j'ai vu beaucoup d'implémentations partielles; J'en passerai en revue quatre ci-dessous. En plus d'être incomplets, ils ont tous leurs problèmes.
@Reto Meier a contribué cette réponse populaire à la même question de base, indiquant que vous utiliseriez setCustomAnimations()
avec un FragmentTransaction
. Pour un scénario à deux fragments (par exemple, vous ne voyez que le fragment A au départ et que vous voulez le remplacer par un nouveau fragment B utilisant des effets animés), je suis entièrement d'accord. Toutefois:
- Étant donné que vous ne pouvez spécifier qu'une seule animation "d'entrée" et une "sortie", je ne vois pas comment vous géreriez toutes les différentes animations requises pour le scénario à trois fragments
- Le
<objectAnimator>
dans son exemple de code utilise des positions câblées en pixels, ce qui semblerait peu pratique étant donné les différentes tailles d'écran, maissetCustomAnimations()
nécessite des ressources d'animation, excluant la possibilité de définir ces choses en Java - Je ne sais pas comment les animateurs d'objets pour l'échelle sont liés à des choses comme
android:layout_weight
dans uneLinearLayout
allocation d'espace en pourcentage - Je suis à une perte sur la façon dont le fragment C est traitée au départ (
GONE
?android:layout_weight
De0
? Pré-animation à une échelle de 0? Autre chose?)
@Roman Nurik souligne que vous pouvez animer n'importe quelle propriété , y compris celles que vous définissez vous-même. Cela peut aider à résoudre le problème des positions câblées, au prix de l'invention de votre propre sous-classe de gestionnaire de mise en page personnalisée. Cela aide certains, mais je suis toujours déconcerté par le reste de la solution de Reto.
L'auteur de cette entrée pastebin montre un pseudo-code alléchant, disant essentiellement que les trois fragments résideraient initialement dans le conteneur, le fragment C étant caché au départ via une hide()
opération de transaction. Nous avons ensuite show()
C et hide()
A lorsque l'événement UI se produit. Cependant, je ne vois pas comment cela gère le fait que B change de taille. Cela repose également sur le fait que vous pouvez apparemment ajouter plusieurs fragments au même conteneur, et je ne suis pas sûr que ce comportement soit fiable ou non sur le long terme (pour ne pas mentionner que cela devrait casser findFragmentById()
, même si je peux vivre avec cela).
L'auteur de ce billet de blog indique que Gmail n'utilise pas setCustomAnimations()
du tout, mais utilise directement des animateurs d'objets ("il suffit de changer la marge gauche de la vue racine + de changer la largeur de la vue droite"). Cependant, il s'agit toujours d'une solution AFAICT à deux fragments, et la mise en œuvre a montré une fois de plus les dimensions des fils durs en pixels.
Je vais continuer à me débrouiller à ce sujet, donc je finirai peut-être par y répondre moi-même un jour, mais j'espère vraiment que quelqu'un a élaboré la solution à trois fragments pour ce scénario d'animation et pourra publier le code (ou un lien vers celui-ci). Les animations sous Android me donnent envie de m'arracher les cheveux, et ceux d'entre vous qui m'ont vu savent que c'est une entreprise largement infructueuse.