J'ai un paragraphe de texte et lorsqu'un bouton est cliqué, je veux que ce texte disparaisse, change en un autre texte, puis revient en arrière. J'ai du code mais il ne fait pas l'animation de fondu en fondu.
final TextView mSwitcher = (TextView) findViewById(R.id.bookContent);
mSwitcher.setText("old text");
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("new text");
mSwitcher.startAnimation(in);
}
});
Vous semblez avoir activé l'animation juste après l'avoir désactivée. Cela ne fait que travailler l'animation "in".
Pour démarrer la deuxième animation 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("New Text");
mSwitcher.startAnimation(in);
}
});
Ensuite, dans votre méthode onClick()
:
public void onClick(View v) {
mSwitcher.startAnimation(out);
}
Cela devrait faire l'affaire.
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 ça aide!
Si vous souhaitez utiliser Animation
, vous pouvez utiliser un AnimatorListener
pour écouter la fin de la première animation, puis 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 à coup sûr.
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 est de regarder les démonstrations d'API, il y a un génial et simple à utiliser l'un des TextSwitcher
. Téléchargez les démonstrations de l'API et vérifiez-les par vous-même, ou voyez ici .
pour ajouter à la réponse eboix ... c'est ainsi que je fade in text et fade out text, avec un délai entre chaque fade et avant fade out (c'est-à-dire juste après fade in).
Mon XML ressemble à ceci.
<TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:gravity="center"
Android:text="Retrieving Result"
Android:textColor="@color/general_app_colour"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
Android:id="@+id/blobText"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:gravity="center"
Android:text="Please Wait" />
</LinearLayout>
Le vous utilisez ces variables dans votre activité/fragment/dialogfragment, voici les variables que j'ai utilisées dans le mien ...
public class Loading_Dialog extends DialogFragment {
public String[] text = new String[]{""};
TextView blobText;
Animation inAnimation;
Animation displayLength;
Animation delayAnimation;
Animation outAnimation;
//duration for fade effects
int fadeEffectDuration = 700;
//duration for delay between fadeout and fadein
int delayDuration = 1000;
int displayFor = 2000;
public String[] text = new String[]{""};
Maintenant, les objets et les variables sont initialisés sont utilisés comme ceci, je l'ai utilisé 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);
Il existe une meilleure façon de produire le même effet.
Vous devez configurer l'animation pour qu'elle se répète 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);
Lorsque j'ai une quantité de textes à FadeIn/FadeOut, je préfère utiliser une fonction pour ce faire:
protected void onCreate(Bundle savedInstanceState) {
{
...
//Declare the array of texts:
String aSentences[]={"Sentence 1", "Sentence 2", "<b><i>Sentence 3</i></b>"};
TextView tView = (TextView)findViewById(R.id.Name_TextView_Object);
//call the function:
animateText(tView,aSentences,0,false);
}
private void animateText(final TextView textView, final String texts[], final int textIndex, final boolean forever) {
//textView <-- The View which displays the texts
//texts[] <-- Holds R references to the texts to display
//textIndex <-- index of the first text to show in texts[]
//forever <-- If equals true then after the last text it starts all over again with the first text resulting in an infinite loop. You have been warned.
int fadeInDuration = 1000; // Configure time values here
int timeBetween = 5000;
int fadeOutDuration = 2000;
textView.setVisibility(View.INVISIBLE); //Visible or invisible by default - this will apply when the animation ends
textView.setText(Html.fromHtml(texts[textIndex]));
Animation fadeIn = new AlphaAnimation(0, 1);
fadeIn.setInterpolator(new DecelerateInterpolator()); // add this
fadeIn.setDuration(fadeInDuration);
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setInterpolator(new AccelerateInterpolator()); // and this
fadeOut.setStartOffset(fadeInDuration + timeBetween);
fadeOut.setDuration(fadeOutDuration);
AnimationSet animation = new AnimationSet(false); // change to false
animation.addAnimation(fadeIn);
if((texts.length-1) != textIndex) animation.addAnimation(fadeOut);
animation.setRepeatCount(1);
textView.setAnimation(animation);
animation.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationEnd(Animation animation) {
if (texts.length -1 > textIndex) {
animateText(textView, texts, textIndex + 1,forever); //Calls itself until it gets to the end of the array
}
else {
textView.setVisibility(View.VISIBLE);
if (forever == true){
animateText(textView, texts, 0,forever); //Calls itself to start the animation all over again in a loop if forever = true
}
else
{//do something when the end is reached}
}
}
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
});
}