48 votes

Comment faire disparaître et réapparaître du texte sur Android ?

J'ai un paragraphe de texte et quand un bouton est cliqué, je veux que le texte s'estompe, change pour un autre texte, puis réapparaisse. J'ai du code mais il ne fait pas l'animation de disparition, juste l'apparition.

    final TextView mSwitcher = (TextView) findViewById(R.id.bookContent);
    mSwitcher.setText("ancien texte");

    final Animation in = new AlphaAnimation(0.0f, 1.0f);
    in.setDuration(3000);

    final Animation out = new AlphaAnimation(1.0f, 0.0f);
    out.setDuration(3000);

    Button moveOn = (Button) findViewById(R.id.moveOn);
    moveOn.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {

            mSwitcher.startAnimation(out);
            mSwitcher.setText("nouveau texte");
            mSwitcher.startAnimation(in);

        }
    });

79voto

eboix Points 3072

Il semble que vous définissiez l'animation sur "in" juste après l'avoir définie sur "out". Cela fait fonctionner uniquement l'animation "in".

Pour que la deuxième animation démarre juste après la première, vous pouvez ajouter un écouteur à votre première animation :

out.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationEnd(Animation animation) {
        mSwitcher.setText("Nouveau texte");
        mSwitcher.startAnimation(in);

    }
});

Ensuite, dans votre méthode onClick() :

public void onClick(View v) {

    mSwitcher.startAnimation(out);

}

Cela devrait fonctionner.


Une autre approche consiste à utiliser AnimationSet.

final Animation in = new AlphaAnimation(0.0f, 1.0f);
in.setDuration(3000);

final Animation out = new AlphaAnimation(1.0f, 0.0f);
out.setDuration(3000);

AnimationSet as = new AnimationSet(true);
as.addAnimation(out);
in.setStartOffset(3000);
as.addAnimation(in);

Ensuite, au lieu de démarrer out, démarrez as.

J'espère que cela vous aidera!

0 votes

@eboxis Merci pour le partage de vos connaissances..y a-t-il un moyen d'effectuer une animation en séquence pour plusieurs vues..J'ai essayé de démarrer l'animation pour la deuxième vue à la fin de l'animation de la première vue...mais quand je le fais...la première vue est animée à nouveau...des suggestions...?

0 votes

Placer le texte avant ou après l'animation de fondu enchaîné dans l'AnimationListener l'implémentation empêche l'animation de fondu enchaîné de se produire -- le nouveau texte apparaît simplement instantanément.

0 votes

@chaussure Voulez-vous dire que la première approche ne fonctionne plus? Dans ce cas, je vais modifier ma réponse.

3voto

Michell Bak Points 6312

Si vous voulez utiliser Animation, vous pouvez utiliser un AnimatorListener pour écouter quand la première animation est terminée, et ensuite démarrer la deuxième animation. Ce serait onAnimationEnd().

Plus d'informations disponibles ici : http://developer.android.com/reference/android/animation/Animator.AnimatorListener.html

Il pourrait y avoir une meilleure façon de le faire avec AnimationSet, mais cela fonctionne sûrement.

3voto

Brian Points 2771

Vous devriez envisager d'utiliser quelque chose comme un TextSwitcher. Il y a un bref document sur TextSwitcher dans la documentation Android. Ce que je recommanderais le mieux cependant est de regarder les API Demos, il y a un excellent et simple à utiliser un de TextSwitcher. Téléchargez les API Demos et vérifiez-les par vous-même, ou consultez ici.

3voto

Il y a un meilleur moyen de produire le même effet.

Vous devriez configurer l'animation pour se répéter en mode inverse.

Voici un exemple:

    final Animation out = new AlphaAnimation(1.0f, 0.0f);
    out.setRepeatCount(Animation.INFINITE);
    out.setRepeatMode(Animation.REVERSE);
    out.setDuration(3000);
    mSwitcher.startAnimation(out);

2voto

user3432667 Points 21

Pour ajouter à la réponse d'eboix... voici comment je fais apparaître du texte en fondu et le faire disparaitre en fondu, avec un délai entre chaque fondu et avant le fondu entrant, (c'est-à-dire juste après le fondu entrant).

Mon XML ressemble à ceci.

Ensuite, vous utilisez ces variables dans votre activité/fragment/dialogfragment, voici les variables que j'ai utilisées dans la mienne...

public class Loading_Dialog extends DialogFragment {
    public String[] text = new String[]{""};
    TextView blobText;
    Animation inAnimation;
    Animation displayLength;
    Animation delayAnimation;
    Animation outAnimation;
    //durée pour les effets de fondu
    int fadeEffectDuration = 700;
    //durée pour le délai entre le fondu sortant et le fondu entrant
    int delayDuration = 1000;
    int displayFor = 2000;
    public String[] text = new String[]{""};

Maintenant que les objets et variables sont initialisés, vous les utilisez comme ceci, j'ai utilisé ceci pour mon fragment de dialogue, dans la méthode onCreateDialog..

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    final Dialog dialog = new Dialog(getActivity(),R.style.LoadingDialogAnimation);
dialog.getWindow().setContentView(R.layout.dialog_loading);
blobText = (TextView) dialog.findViewById(R.id.blobText);
    inAnimation = new AlphaAnimation(0f, 1f);
    inAnimation.setDuration(fadeEffectDuration);        
    displayLength = new AlphaAnimation(1f, 1f);
    displayLength.setDuration(displayFor);
    delayAnimation = new AlphaAnimation(0f, 0f);
    delayAnimation.setDuration(delayDuration);
    outAnimation = new AlphaAnimation(1f, 0f);
    outAnimation.setDuration(fadeEffectDuration);
    inAnimation.setAnimationListener(new AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        position++;
    if(position>=text.length)
    {
        position = 0;
    }
    blobText.setText(text[position]);
}           
@Override
public void onAnimationRepeat(Animation animation) {}           
@Override
public void onAnimationEnd(Animation animation) {
    blobText.startAnimation(displayLength);
}
});

displayLength.setAnimationListener(new AnimationListener() {

@Override
public void onAnimationStart(Animation animation) {
    // TODO Auto-generated method stub

}

@Override
public void onAnimationRepeat(Animation animation) {
   // TODO Auto-generated method stub

}

@Override
public void onAnimationEnd(Animation animation) {
    // TODO Auto-generated method stub
    blobText.startAnimation(outAnimation);  
}
});

    outAnimation.setAnimationListener(new AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // TODO Auto-generated method stub
        blobText.startAnimation(delayAnimation);    
    }
    });
    delayAnimation.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    // TODO Auto-generated method stub

    }

@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
    blobText.startAnimation(inAnimation);
}
});

blobText.startAnimation(outAnimation);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X