Comment animer la traduction d'une vue

Au premier clic d'un bouton, je souhaite faire glisser une View long de l'axe des x (par 200 pixels à droite, disons). Et sur la deuxième pression sur le bouton, je souhaite faire glisser la View vers l'arrière le long de l'axe des x jusqu'à sa position d'origine.

La View.setTranslationX(float) saute la vue aux emplacements horizontaux cibles avec les appels myView.setTranslationX(200); Et myView.setTranslationX(0); respectivement. Quelqu'un sait-il comment je peux déplacer la View vers les emplacements horizontaux de la cible à la place?

Note 1: A TranslateAnimation n'est pas bon car il ne déplace pas réellement la View mais ne présente que l'illusion de celle-ci en mouvement.

Note 2: Je ne me suis pas rendu compte au moment de poser la question selon laquelle les setTranslationX(float) et setTranslationY(float) ont été introduites à partir de l'API Level 11. Si vous ciblez Honeycomb (API Level 11) vers le haut, puis Gautam La réponse de K suffira. Sinon, voir ma réponse pour une solution proposée.

  • Attributs XML personnalisés sans affichage personnalisé en fragment
  • Utilisation de forceLayout (), requestLayout () et invalidate ()
  • Chargement des images dans GridView à l'aide de Universal Image Loader
  • Est-il possible de raccourcir les noms de vue personnalisés?
  • Est-ce que la "étiquette" d'une vue est restaurée lorsque l'activité dont la mise en page contient la vue est recréée?
  • Comment ajouter une vue personnalisée à la mise en page?
  • Comment puis-je dessiner une vue animée dans Android?
  • OnBackStackChanged () appelé deux fois lorsque le nouveau fragment est ajouté dans la couche arrière
  • 3 Solutions collect form web for “Comment animer la traduction d'une vue”

    Essayez d'examiner ObjectAnimator et son Super Class Value Animator

    Vous pouvez faire quelque chose comme ceci ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); Puis anim.start();

    Utilisez une valeur boolean et basculez avec 200,0 dans l'animateur d'objet pour reculer

    PS: vous pouvez utiliser la méthode setDuration pour définir la durée à suivre pour l'animation

    Modifier :

    Essayez de regarder la bibliothèque de support qui fournit une compatibilité ascendante.

    modifier

    Comme @AdilHussain a souligné, il existe une bibliothèque appelée nineoldandroids qui peut être utilisée dans le même but sur les anciens androïdes.

    Celui-ci m'a fait perplexe pendant quelques jours (en train de fonctionner avant Ice Cream Sandwich) mais je pense que je suis enfin arrivé là-bas! (Merci à Gautam K et Mike Israel pour les prospects) Ce que j'ai fait à la fin était d'étendre ma View (un FrameLayout ) pour commencer la traduction des animations droite / gauche au besoin et pour écouter la fin des animations afin de déménager My FrameLayout droit / gauche selon le cas, comme suit:

     public class SlidingFrameLayout extends FrameLayout { private final int durationMilliseconds = 1000; private final int displacementPixels = 200; private boolean isInOriginalPosition = true; private boolean isSliding = false; public SlidingFrameLayout(Context context) { super(context); } public SlidingFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onAnimationEnd() { super.onAnimationEnd(); if (isInOriginalPosition) offsetLeftAndRight(displacementPixels); else offsetLeftAndRight(-displacementPixels); isSliding = false; isInOriginalPosition = !isInOriginalPosition; } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // need this since otherwise this View jumps back to its original position // ignoring its displacement // when (re-)doing layout, eg when a fragment transaction is committed if (changed && !isInOriginalPosition) offsetLeftAndRight(displacementPixels); } public void toggleSlide() { // check whether frame layout is already sliding if (isSliding) return; // ignore request to slide if (isInOriginalPosition) startAnimation(new SlideRightAnimation()); else startAnimation(new SlideLeftAnimation()); isSliding = true; } private class SlideRightAnimation extends TranslateAnimation { public SlideRightAnimation() { super( Animation.ABSOLUTE, 0, Animation.ABSOLUTE, displacementPixels, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0); setDuration(durationMilliseconds); setFillAfter(false); } } private class SlideLeftAnimation extends TranslateAnimation { public SlideLeftAnimation() { super( Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -displacementPixels, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0); setDuration(durationMilliseconds); setFillAfter(false); } } } 

    Et enfin, pour glisser le SlidingFrameLayout droite / gauche, tout ce que vous devez faire est d'appeler la méthode SlidingFrameLayout.toggleSlide() . Bien sûr, vous pouvez modifier ce SlidingFrameLayout pour que vous puissiez faire glisser un plus grand nombre de pixels, glisser plus longtemps, mais cela devrait suffire pour vous démarrer 🙂

    J'ai eu un problème similaire, TranslateAnimation déplace réellement la vue si vous appelez setFillAfter maintenant ( bug d'Android ). Je devais faire quelque chose de similaire, alors j'ai dit, hey, nous allons utiliser un auditeur d'animation, puis tout simplement déplacer tout à l'emplacement correct. Malheureusement, il y a aussi un bug sur les auditeurs d'animation ( solution stackoverflow ). J'ai donc créé ma propre classe de mise en page en fonction de la solution dans la solution stackoverflow et j'ai bien voulu 🙂

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