Travail complet de l'Échantillon de l'Gmail Trois-Fragment d'Animation de Scénario?
TL;DR: je suis à la recherche d'un de travail complet de l'échantillon de ce que j'appellerai "l'Gmail trois-fragment d'animation" scénario. Plus précisément, nous voulons commencer avec deux fragments, comme ceci:
Lors d'un événement l'INTERFACE utilisateur (par exemple, en tapant sur quelque chose dans le Fragment B), nous voulons:
- Fragment d'Un glisser hors de l'écran vers la gauche
- Fragment B de glisser vers le bord gauche de l'écran et rétrécir à prendre la place vacante par le Fragment d'Un
- Le Fragment C de glisser le bord droit de l'écran et de prendre la place vacante par le Fragment B
Et, sur un bouton de RETOUR de la presse, nous voulons que l'ensemble des opérations devant être inversé.
Maintenant, j'ai vu beaucoup de partielle implémentations, je vais examiner quatre d'entre eux ci-dessous. Au-delà d'être incomplètes, elles ont toutes leurs questions.
@Reto Meier contribué cette réponse à la même question de base, indiquant que vous pouvez utiliser setCustomAnimations()
avec un FragmentTransaction
. Pour un deux-fragment de scénario (par exemple, vous ne voyez qu'Un Fragment d'abord, et que vous voulez le remplacer par un nouveau Fragment B à l'aide d'effets d'animation), je suis tout à fait d'accord. Cependant:
- Puisque vous ne pouvez spécifier qu'un "in" et un "dehors" de l'animation, je ne vois pas comment vous pourriez faire face à toutes les animations nécessaires pour les trois-fragment de scénario
- La
<objectAnimator>
dans son exemple de code utilise câblé positions en pixels, et qui semble pas pratique, compte tenu de diverses tailles d'écran, maissetCustomAnimations()
nécessite d'animation de ressources, ce qui exclut la possibilité de définir ces choses en Java - Je suis à une perte quant à la façon dont l'objet de l'animation pour l'échelle de la cravate avec des choses comme
android:layout_weight
dans unLinearLayout
pour allouer de l'espace sur la base d'un pourcentage - Je suis à une perte quant à la façon dont le Fragment C est gérée au départ (
GONE
?android:layout_weight
de0
? pré-animation d'une échelle de 0? quelque chose d'autre?)
@Roman Nurik souligne que vous pouvez animer toute la propriété, y compris ceux que vous définissez vous-même. Qui peut aider à résoudre le problème de la filaire de positions, au prix d'inventer votre propre mise en page personnalisée gestionnaire de sous-classe. Qui aide à certains, mais je suis toujours sidéré par le reste de Reto de la solution.
L'auteur de ce pastebin entrée montre certaines alléchantes pseudo-code, ce qui revient à dire que tous les trois fragments réside dans le conteneur d'abord, avec le Fragment C cachés au départ par l'intermédiaire d'un hide()
opération de transaction. Nous avons ensuite show()
C et hide()
Un lorsque l'INTERFACE utilisateur de l'événement se produit. Cependant, je ne vois pas comment il gère le fait que B des changements de taille. Il s'appuie également sur le fait que, apparemment, vous avez peut ajouter plusieurs fragments de la même conteneur, et je ne suis pas sûr de savoir si ou non la fiabilité de comportement sur le long terme (pour ne pas mentionner il devrait casser findFragmentById()
, si je peux vivre avec ça).
L'auteur de ce blog indique que Gmail n'est pas à l'aide de setCustomAnimations()
à tous, mais plutôt directement utilise l'objet d'animateurs ("vous venez de changer de marge de gauche de la vue racine + changement de la largeur de la vue de droite"). Cependant, c'est toujours un deux-fragment solution AFAICT, et la mise en œuvre une fois de plus montré dur-fils dimensions en pixels.
Je vais continuer à bosser à cette, afin que je puisse la liquidation de répondre à cette question à moi-même un jour, mais je suis vraiment en espérant que quelqu'un a travaillé sur les trois-fragment de solution pour cette animation scénario et peux poster le code (ou un lien de celui-ci). Animations dans Android me faire tirer mes cheveux, et ceux d'entre vous qui m'ont vu savent que c'est une grande partie stériles effort.
- N'est-il pas quelque chose de ce genre posté par Romain Guy? curious-creature.org/2011/02/22/...
- Il n'est pas à l'aide de fragments AFAICT. Visuellement, c'est le droit de base de l'effet, et je peut être en mesure de l'utiliser pour un autre point de données pour essayer de créer un fragment de réponse. Merci!
- Juste une pensée: le standard de l'application e-Mail est similaire (mais pas identique) comportement sur mon Nexus 7 — qui devrait être open source.
- L'application de Messagerie électronique utilise une coutume "ThreePaneLayout" qui anime la position de la gauche de la Vue, et la largeur et de la visibilité des deux autres points de Vue — qui contiennent pertinentes Fragment.
- C'est très intéressant. Je n'ai pas utilisé le PSBA application e-Mail, donc je ne savais pas qu'ils ont utilisé la même INTERFACE utilisateur de base de la structure il y a comme avec Gmail. Notez que je n'ai aucun moyen de l'attribution d'une prime à un commentaire, vous pouvez envisager la rédaction d'une réponse avec vos pensées sur le
ThreePaneLayout
mise en œuvre. Merci! - pouvez-vous me dire les Fragments A et B sont-ils mesurés? est-il sur linearLayout avec le poids de l'attribut? Par rapport à la norme de DPs , le Fragment A est wrap_content et B remplit le reste de l'écran? Aussi Dessiné la mise en cache est-elle autorisée ? ( ce qui signifie que les mises en page ne peut pas mettre à jour lors de l'animation)
- - vous me dire les Fragments A et B sont-ils mesurés?" -- une de vos approches, ce serait bien, même si j'ai une légère préférence pour le
LinearLayout
/poids de l'approche. "Aussi Dessiné la mise en cache est-elle autorisée ? ( ce qui signifie que les mises en page ne peut pas mettre à jour lors de l'animation)" -- :: haussement d'épaules :: en dehors de peut-être à l'aide de couches de matériel dans les versions ultérieures d'Android, je n'ai pas donné cet aspect de beaucoup de pensée. - ont une légère préférence pour le LinearLayout/poids de l'approche" de manière personnalisée (bootstrap style) ViewGroup qui sépare la largeur de l'écran avec N égal unités et chaque fragment prend x*N largeur de l'espace est autorisé.(Près de quel poids, mais un peu plus contrôlable)
- Le contrôle est la clé de la chose, en particulier de contrôle qui peut être basée sur l'espace disponible dans le conteneur global (vs le calcul d'un tas de valeurs de dimension, comme le PSBA application de Messagerie électronique de l'est). Cependant, "N unités égales" n'est certainement pas ce que je recherche, car l'obtention du Fragment B de redimensionner à ce Fragment d'Une taille a été est une touche délicate pièce de ce puzzle.
- hey @CommonsWare je ne vais pas la peine ppl avec toute ma réponse ici, mais il y a une question similaire à la vôtre, en qui j'ai donné un très de réponse satisfaisante. Donc, juste une suggestion à vous de le vérifier (vérifiez également les commentaires): stackoverflow.com/a/14155204/906362
Vous devez vous connecter pour publier un commentaire.
Téléchargé ma proposition à github
(Fonctionne avec toutes les versions d'android mais vue de l'accélération matérielle est fortement recommandé pour ce genre d'animations. Pour les non accélération matérielle des périphériques une mise en cache des bitmaps de la mise en œuvre devrait mieux)
Vidéo de démonstration avec l'animation est Ici (ralentissement de la cadence cause de l'écran de fonte. La performance réelle est très rapide)
Utilisation:
Explication:
Créé une nouvelle custom RelativeLayout(ThreeLayout) et 2 Animations personnalisées(MyScalAnimation, MyTranslateAnimation)
ThreeLayout
obtient le poids du volet de gauche comme param ,en supposant que les autres d'affichage visible aweight=1
.Donc
new ThreeLayout(context,3)
crée un nouveau point de vue avec les 3 enfants et le volet de gauche ont 1/3 de l'écran total. L'autre point de vue, occupe tout l'espace disponible.Échelle et translation des animations redimensionnez et déplacez le point de vue et non de pseudo-[échelle,déplacer]. Notez que
fillAfter(true)
n'est pas utilisé n'importe où.Vue2 est right_of Vue1
et
Vue3 est right_of Vue2
Avoir ces règles sont fixées par RelativeLayout prend soin de tout le reste. Animations modifier le
margins
(sur le coup) et[width,height]
sur l'échellePour accéder à chaque enfant (de sorte que vous pouvez le gonfler avec votre Fragment que vous pouvez appeler
Ci-dessous sont démontrés les 2 animations
Stage1
Stage2
View
plus petit), mais dans Gmail/e-Mail, nous n'avons pas d'obtenir de petites polices, juste moins de mots.scaleX
valeur surView
, mais j'ai peut-être mal interprété les choses.OK, voici ma solution, dérivé de l'e-Mail PSBA application, par @Christophe suggestion dans la question de commentaires.
https://github.com/commonsguy/cw-omnibus/tree/master/Animation/ThreePane
@weakwire la solution est pas sans rappeler la mienne, bien qu'il utilise le classique
Animation
plutôt que des animateurs, et il utiliseRelativeLayout
règles à appliquer de positionnement. À partir de la bounty point de vue, il sera probablement obtenir la prime, à moins que quelqu'un d'autre avec un ciré solution encore des postes une réponse.En un mot, la
ThreePaneLayout
dans ce projet est unLinearLayout
sous-classe, conçu pour fonctionner en mode paysage avec trois enfants. Ces enfants largeurs peuvent être définies dans le schéma XML, via n'importe quel souhaité signifie-je montrer à l'aide de poids, mais vous pourriez avoir largeurs spécifiques fixés par la dimension des ressources ou quoi que ce soit. Le troisième enfant, le Fragment C de la question, doit avoir une largeur de zéro.Cependant, au moment de l'exécution, peu importe comment vous avez créée à l'origine pour la largeur, la largeur de la gestion est prise en charge par
ThreePaneLayout
la première fois que vous utilisezhideLeft()
pour passer de montrer que la question posée comme des Fragments A et B à des Fragments B et C. Dans la terminologie de laThreePaneLayout
-- qui n'a pas des relations spécifiques avec des fragments -- les trois morceaux sontleft
,middle
, etright
. Au moment de l'appelhideLeft()
, nous enregistrons les tailles deleft
etmiddle
et zéro tous les poids qui ont été utilisés sur l'un des trois, de sorte que nous pouvons contrôler complètement les tailles. Au moment dehideLeft()
, nous avons fixé la taille deright
à la taille d'origine demiddle
.Les animations sont de deux ordres:
ViewPropertyAnimator
pour effectuer une traduction des trois widgets vers la gauche par la largeur deleft
, à l'aide d'une couche matérielleObjectAnimator
sur un custom pseudo-propriété demiddleWidth
pour changer lemiddle
la largeur de ce qu'il a commencé avec de la largeur d'origine deleft
(il est possible que c'est une meilleure idée d'utiliser un
AnimatorSet
etObjectAnimators
dans tous ces cas, bien que cela fonctionne pour l'instant)(il est également possible que le
middleWidth
ObjectAnimator
nie la valeur de la couche matérielle, puisque ça demande assez continue d'invalidation)(c'est certainement possible que j'ai encore des lacunes dans mon animation à la compréhension, et que j'aime entre parenthèses consolidés)
L'effet net est que
left
glisse hors de l'écran,middle
glisse vers la position d'origine et la taille deleft
, etright
se traduit en droit derrièremiddle
.showLeft()
renverse simplement le processus, avec le même mélange d'animateurs, juste avec les directions inversées.L'activité utilise un
ThreePaneLayout
de tenir une paire deListFragment
widgets et unButton
. Choisir quelque chose dans la gauche fragment ajoute (ou met à jour le contenu de) le milieu fragment. La sélection de quelque chose dans le milieu fragment définit la légende de laButton
, plus exécutehideLeft()
sur leThreePaneLayout
. En appuyant sur le DOS, si nous avons caché le côté gauche, exécuteshowLeft()
; sinon, sorties de l'activité. Ce n'est pas l'utilisationFragmentTransactions
pour affecter les animations, nous sommes coincés de la gestion de cette "pile de retour" de nous-mêmes.Le projet lié à ci-dessus utilisant les fragments et les natifs de l'animateur-cadre. J'ai une autre version du même projet qui utilise le Soutien Android fragments de backport et NineOldAndroids pour l'animation:
https://github.com/commonsguy/cw-omnibus/tree/master/Animation/ThreePaneBC
Le backport fonctionne très bien sur une 1ère génération de Kindle Fire, si l'animation est un peu saccadé compte tenu de la baisse des spécifications matérielles et le manque de matériel de support de l'accélération. Les deux implémentations semble lisse sur une Nexus 7 et d'autres en cours de génération de tablettes.
Je suis tout à fait ouvert pour des idées sur la façon d'améliorer cette solution, ou d'autres solutions qui offrent des avantages indéniables par rapport à ce que j'ai fait ici (ou ce que @weakwire utilisé).
Merci encore à tous ceux qui ont contribué!
ThreePaneLayout
, commeLinearLayout
ne prend pas en charge les chevauchements sur l'axe des Z.ListView
et appuyé sur bouton de retour rapidement et répété ensuite toute la Mise en page a dérivé vers la droite. Il a commencé à montrer de l'espace supplémentaire de la colonne sur la gauche. Ce comportement introduit parce que je ne la laisserais pas la première animation (commencé par taper sur milieuListView
) complète et appuyé sur le bouton de retour. Je l'ai corrigé en remplaçanttranslationXBy
avectranslationX
danstranslateWidgets
méthode ettranslateWidgets(leftWidth, left, middle, right);
avectranslateWidgets(0, left, middle, right);
dansshowLeft()
méthode.requestLayout();
avecmiddle.requestLayout();
danssetMiddleWidth(int value);
méthode. Il ne peut pas l'effet de la performance que je suppose que le GPU sera toujours de faire une passe de mise en page, des commentaires?Nous avons construit une bibliothèque appelée PanesLibrary qui résout ce problème. C'est même plus souple que ce qui a été précédemment proposé en raison de:
Vous pouvez le vérifier ici: https://github.com/Mapsaurus/Android-PanesLibrary
Voici une démo: http://www.youtube.com/watch?v=UA-lAGVXoLU&feature=youtu.être
Qu'il est fondamentalement vous permet de facilement ajouter n'importe quel nombre de dynamiquement la taille des volets et de fixer des fragments de ces volets. J'espère que vous trouverez utile! 🙂
Construction d'un des exemples que vous avez associé (http://android.amberfog.com/?p=758), comment sur l'animation de la
layout_weight
propriété? De cette façon, vous pouvez animer le changement de poids de la 3 fragments, ET vous obtenez le bonus qu'ils ont tous diapositive bien ensemble:Commencer avec une mise en page simple. Depuis nous allons animer
layout_weight
, nous avons besoin d'unLinearLayout
que la vue de la racine pour les 3 panneaux.:Puis la démo de classe:
Aussi cet exemple n'utilise pas FragmentTransactions pour atteindre les animations (plutôt, il anime les points de vue les fragments sont rattachés), de sorte que vous devez faire tous les backstack/fragment opérations vous-même, mais par rapport à l'effort d'obtenir les animations fonctionne parfaitement, ce qui ne marche pas ressembler à un mauvais compromis 🙂
Horrible basse-résolution vidéo de lui en action: http://youtu.be/Zm517j3bFCo
TextView
avecwrap_content
étirement de lui-même à la verticale comme l'animation d'un produit). Cependant, il se peut que d'animer le poids est la façon dont ils redimensionner ce que j'ai appelé comme Fragment B. Merci!Ce n'est pas à l'aide de fragments.... C'est une mise en page personnalisée avec 3 enfants. Lorsque vous cliquez sur un message, vous compensez les 3 enfants à l'aide de
offsetLeftAndRight()
et un animateur.Dans
JellyBean
vous pouvez activer "Afficher la mise en page des limites" dans le "Développeur" Options de paramètres. Lorsque la diapositive d'animation est terminée, vous pouvez voir que le menu de gauche est toujours là, mais sous le panneau du milieu.Il est similaire à la Cyril Mottier Mouche-dans le menu app, mais avec 3 éléments au lieu de 2.
Par ailleurs, la
ViewPager
de la troisième enfants, est une autre indication de ce comportement:ViewPager
utilise généralement des Fragments (je sais qu'ils n'ont pas à, mais je n'ai jamais vu une mise en œuvre autres queFragment
), et puisque vous ne pouvez pas utiliseFragments
l'intérieur d'un autreFragment
les 3 enfants sont sans doute pas des fragments....TranslateAnimation
, mais je suis sûr qu'il ya des façons d'utiliser les animateurs d'atteindre les mêmes fins. Je vais devoir courir quelques expériences sur ce sujet. Merci!Je suis en train d'essayer de faire quelque chose comme ça, sauf que le Fragment B de l'échelle de prendre l'espace disponible et que le 3 volet peuvent être ouvertes en même temps si il y a assez de place. Voici ma solution jusqu'à présent, mais je ne sais pas si je vais rester avec elle. J'espère que quelqu'un aura une réponse de montrer Le Droit Chemin.
Au lieu d'utiliser un LinearLayout et de l'animation du poids, j'utilise un RelativeLayout et d'animer les marges. Je ne suis pas sûr que c'est le meilleur moyen, car il nécessite un appel à requestLayout() à chaque mise à jour. Il est lisse sur tous mes appareils mais.
Donc, j'anime la mise en page, je ne suis pas à l'aide de fragments de transaction. J'gérer le bouton manuellement pour fermer le fragment C si elle est ouverte.
FragmentB utilisation layout_toLeftOf/ToRightOf à garder aligné à fragment A et C.
Lorsque mon application déclencher un événement pour afficher le fragment C, j'ai glisser dans le fragment C, et je coulissant, le fragment A, dans le même temps. (2 animations). Inversement, lorsqu'Un Fragment de l'ouvrir, je ferme C en même temps.
En mode portrait ou sur le petit écran, j'utilise une mise en page légèrement différente et faites glisser le Fragment C au dessus de l'écran.
D'utiliser le pourcentage de la largeur du Fragment A et C, je crois que vous avez pour le calculer au moment de l'exécution... (?)
Ici est l'activité de mise en page:
L'animation de glisser FragmentC ou arrière: