Comment Animer des propriétés de la structure de ViewGroups?
J'ai le schéma suivant:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<FrameLayout android:id="@+id/viewgroup_left"
android:layout_height="match_parent"
android:layout_weight="2"
android:layout_width="0dp">
... children ...
</FrameLayout>
<LinearLayout android:id="@+id/viewgroup_right"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_width="0dp"
android:orientation="vertical">
... children ...
</LinearLayout>
</LinearLayout>
Je me retrouve avec quelque chose comme ceci:
+------------------------+------------+
| | |
| | |
| Left | Right |
| | |
| | |
+------------------------+------------+
Lorsqu'un certain bascule est activée, je veux animer Gauche, de sorte que sa largeur s'agrandit pour remplir la totalité de l'écran. En même temps, je tiens à animer la largeur de Droit, afin qu'il réduit à zéro. Plus tard, lorsque l'interrupteur est basculé de nouveau, j'ai besoin de remettre les choses au-dessus de l'état.
J'ai essayé d'écrire ma propre Animation qui appelle View.getWidth()
mais quand je les anime de revenir à cette valeur (par la mise en View.getLayoutParams().width
), il est plus large que lorsqu'il a commencé. Je pense que je suis juste de faire le mal. J'ai aussi lu toute la documentation sur le Nid d'animation des trucs, mais je ne veux pas de traduire ou de l'échelle... j'ai envie d'animer la mise en page de la largeur de la propriété. Je ne peux pas trouver un exemple de cela.
Quelle est la bonne façon de le faire?
OriginalL'auteur i_am_jorf | 2011-09-22
Vous devez vous connecter pour publier un commentaire.
Puisque personne ne vous a aidé encore et ma première réponse a été un tel désordre, je vais essayer de vous donner la bonne réponse cette fois 😉
En fait j'aime l'idée et je pense que c'est un grand effet visuel qui pourrait être utile pour un tas de gens. Je voudrais mettre en œuvre un dépassement de capacité de la vue de droite (je pense que le film semble étrange, puisque le texte est en expansion vers le bas).
Mais de toute façon, voici le code qui fonctionne parfaitement bien (vous pouvez même basculer alors que c'est l'animation).
Explication rapide:
Vous appelez
toggle
avec une valeur booléenne pour votre direction et cela va démarrer un gestionnaire d'appel d'animation en boucle. Cela permettra d'augmenter ou de diminuer le poids des deux points de vue basés sur l'orientation et le temps passé (pour un bon calcul et de l'animation). L'animation à l'appel de la boucle va s'appeler elle-même tant qu'il n'a pas atteint le début ou la fin de position.La mise en page:
L'activité:
OriginalL'auteur Knickedi
Juste ajouter mes 2 cents ici pour Knickedi excellente réponse, juste au cas où quelqu'un en a besoin:
Si vous animer à l'aide d'haltères vous allez vous retrouver avec des problèmes avec l'écrêtage/non-clipping sur les contenus points de vue et viewgroups. Cela est particulièrement vrai si vous utilisez viewgroups avec le poids que fragment de conteneurs. Pour les surmonter, vous pourriez aussi bien besoin pour animer les marges de la problématique de l'enfant vues et viewgroups /fragment de conteneurs.
Et, pour faire toutes ces choses ensemble, il est toujours préférable d'opter pour ObjectAnimator et AnimatorSet (si vous pouvez les utiliser), ainsi que quelques classes utilitaires comme MarginProxy
OriginalL'auteur Machine
Une façon différente de la solution posté par @knickedi est d'utiliser ObjectAnimator au lieu de l'Exécutable. L'idée est d'utiliser ObjectAnimator pour ajuster le poids de gauche et de droite, vues. Les points de vue, cependant, ont besoin d'être adaptés afin que le poids peut être exposée en tant que propriété de la ObjectAnimator pour animer.
Alors d'abord, de définir une vue sur mesure (à l'aide d'un LinearLayout à titre d'exemple):
Ensuite, la mise à jour de la mise en page XML à utiliser cette coutume linéaire de la mise en page.
Puis, quand vous en avez besoin pour basculer de l'animation, de l'utilisation ObjectAnimator:
Le code ci-dessus suppose que les deux points de vue sont linéaires disposition et sont à moitié en poids pour commencer. L'animation permettra d'élargir la vue de droite de poids (donc celui de gauche est caché). Notez que ObjectAnimator est animé à l'aide de la "MyWeight" propriété de l'personnalisé linéaire de la mise en page. Le AnimatorSet est utilisé pour les attacher à la fois à gauche et à droite ObjectAnimators ensemble, de sorte que l'animation semble lisse.
Cette approche réduit le besoin d'écrire du code exécutable et le calcul des poids à l'intérieur, mais il a besoin d'une classe personnalisée à définir.
OriginalL'auteur henry000