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?

  • Comment importer un projet de bibliothèque eclipse à partir de github vers un projet de studio Android?
  • Android: après avoir construit une source de plate-forme, comment signer un APK arbitraire avec une clé de plate-forme?
  • IntelliJ Build Error Context Mismatch
  • Android spinner montrant la référence de l'objet au lieu de la chaîne
  • Test de code Android avec JUnit et le JDK
  • Mesurer le temps de démarrage de l'application Android
  • 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.

  • Android Lollipop 5.0.1 SQLiteLog POSIX Erreur 11 Erreur SQLite: 3850
  • EditText provoque une fuite de mémoire
  • Empêchez-vous recharger WebView dans FragmentPagerAdapter?
  • Quelqu'un peut-il expliquer OAuth?
  • Y a-t-il un SDK d'API Twitter pour Android?
  • Nom du thème Android à partir de l'ID du thème
  • 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.