tutorial - valueanimator android




Android: réinitialisation de la position de l'animation une fois terminée (6)

Ce problème a dérangé pendant plus d'une semaine. Et la réponse de Muhammad m'a indiqué un moyen astucieux de le résoudre.

J'ai utilisé plusieurs dispositions pour implémenter des menus avec animation. "view.layout ne sera pas persistant. Vous devez utiliser LayoutParams, qui sera persistant."

Voici ma solution: (Utilisez quel type de LayoutParameter dépend de la disposition de votre propre parent):

@Override
public void onAnimationEnd(Animation animation) {
FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(screenWidth, screenHeight);
layoutParams.setMargins((int) -(screenWidth * RATE), 0,
            (int) (screenWidth - screenWidth * RATE), screenHeight);
    for(View v:views) {

        v.setLayoutParams(layoutParams);
        //v.layout((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight);
        v.clearAnimation();
    }
}

J'utilise une animation définie par xml pour faire glisser une vue de l'écran. Le problème est que, dès que l'animation est terminée, elle revient à sa position d'origine. J'ai besoin de savoir comment résoudre ce problème. Voici le XML:

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
   <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/></set>

Voici le Java que j'utilise pour l'appeler:

    homeScrn = (View)findViewById(R.id.homescreen);
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out);

    //Set Click Listeners For Menu
    btnHelp.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            LayoutInflater.from(getApplicationContext()).inflate(R.layout.help, (ViewGroup)findViewById(R.id.subpage), true);
            homeScrn.startAnimation(slideLeftOut);
        }
    });

Donc, fondamentalement, ce qui se passe est que je gonfle une vue sous une autre. Ensuite, j'anime la vue en haut à gauche. Dès que l'animation est terminée et que l'animation est terminée, sa position est réinitialisée.


Enfin, vous avez un moyen de contourner le setFillAfter(true) , la bonne façon de le faire est setFillAfter(true) ,

si vous voulez définir votre animation au format xml, alors vous devriez faire quelque chose comme ça

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/decelerate_interpolator"
     android:fillAfter="true">

    <translate 
        android:fromXDelta="0%"
        android:toXDelta="-100%"
        android:duration="1000"/>

</set>

vous pouvez voir que j'ai défini filterAfter="true" dans la balise set , si vous essayez de le définir dans la balise translate cela ne fonctionnera pas, cela pourrait être un bug dans le cadre !!

puis dans le code

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
someView.startAnimation(anim);

OU

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0);

animation.setFillAfter(true);

animation.setDuration(1800);

someView.startAnimation(animation);

alors ça va sûrement marcher !!

Maintenant, c'est un peu délicat, il semble que la vue se déplace en fait vers la nouvelle position mais en réalité les pixels de la vue sont déplacés, c'est-à-dire que votre vue est en réalité à sa position initiale mais n'est pas visible, vous pouvez la tester si vous avez un bouton ou une vue cliquable dans votre vue (dans mon cas, dans la mise en page), pour résoudre ce problème, vous devez déplacer manuellement votre vue / mise en page vers le nouvel emplacement

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

new TranslateAnimation(-90, 150, 0, 0);

maintenant que nous pouvons voir que notre animation commence à partir de -90 axe des x à 150 axes des x

donc ce que nous faisons est réglé

someView.setAnimationListener(this);

et en

public void onAnimationEnd(Animation animation)
{
   someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight());
}

permettez-moi maintenant d'expliquer public void layout (int left, int top, int right, int botton)

il déplace votre mise en page vers une nouvelle position. Le premier argument définit la gauche, ce qui correspond à 150 , car l’animation de traduction a animé notre vue sur l’ axe des x 150 , top correspond à 0 car nous n’avons pas animé l’axe des y, nous l’avons fait maintenant. someView.getWidth() + 150 gros, nous obtenons la largeur de notre vue et nous en ajoutons 150 car nous sommes maintenant à gauche, nous passons à l' axe des x 150 pour que la largeur de la vue soit identique à celle d'origine, et que le bas soit égal à la hauteur de notre vue .

J'espère que vous comprenez maintenant le concept de la traduction et que vous avez encore des questions à poser immédiatement dans la section commentaires, je me fais un plaisir de vous aider :)

EDIT N'utilisez pas la méthode layout() car elle peut être appelée par le framework chaque fois que la vue est invalidée et que vos modifications ne sont pas conservées. Utilisez LayoutParams pour définir vos paramètres de présentation en fonction de vos besoins.


Je suis peut-être un peu en retard pour répondre, mais j'ai la solution pour cela:

Ajoutez simplement android:fillAfter="true" dans votre android:fillAfter="true" xml


Les animations fonctionnent comme prévu. Ce n’est pas parce que vous avez animé quelque chose que vous l’avez déplacé. Une animation n'affecte que les pixels dessinés pendant l'animation elle-même, pas la configuration des widgets.

Vous devez ajouter un AnimationListener et, dans la méthode onAnimationEnd() , effectuez quelque chose qui rend votre déplacement permanent (par exemple, supprime la vue supérieure de son parent, marque la vue supérieure comme ayant la visibilité GONE ).


Vous devez ajouter cette commande:

final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0);
animSlideLeft.setFillAfter(true);

Vous pouvez utiliser

fillAfter=true
fillEnabled=true

Votre vue ne sera pas réinitialisée à la position d'origine, mais si vous avez des boutons ou quelque chose d'autre dans votre vue, leur position ne changera pas.

Vous devez utiliser ObjectAnimator , cela fonctionne à partir de l'API 11. Il change la position de la vue automatique,

voici l'exemple

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX);
objectAnimator.setDuration(1000);
objectAnimator.start();

Merci JUL pour sa answer

Si l' object animator ne correspond pas à votre application, modifiez le niveau de l'API depuis Project -> properties -> Android , puis import android.animation.ObjectAnimator;

Cordialement Hayk





android