2010-08-19 2 views
16

У меня есть два TranslateAnimations на TextView, и я хочу, чтобы они выполнялись один за другим. Однако, используя приведенный ниже код, выполняется только второй.Android Animation один за другим

Как я могу это решить?

TranslateAnimation animation = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f, 
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f); 
animation.setDuration(200); 
wave.startAnimation(animation); 

TranslateAnimation animation1 = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f, 
    Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f); 
animation1.setDuration(200); 
wave.startAnimation(animation1); 
+5

что волна здесь? –

ответ

29

EDIT: Энди Boots ответ ниже, тем лучше ответ имо.


Просто установите первый, как это, и он будет начать другую, как только анимация заканчивается:

animation.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) { 
      wave.startAnimation(animation1); 

     } 
    }); 

редактировать: Причина только ваша вторая анимация выполняется с текущим кодом, заключается в том, что он отменяет игру первой анимации (оба на самом деле воспроизводятся, но вы видите только последнюю, чтобы начать). Если вы сделаете так, как я написал, они будут играть последовательно, а не параллельно.

+0

Спасибо Попробуй, и он работает так, как я хотел ... но просто любопытно, есть ли другой лучший способ сделать это? – amithgc

+0

Не знаю, что я знаю, sry; _; – pgsandstrom

+0

Спасибо. Это работает, как я ищу. , , – 2011-05-27 04:37:15

49

связать их вместе с Animation Set

AnimationSet as = new AnimationSet(true) 
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f, 
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f); 
animation.setDuration(200); 
as.addAnimation(animation); 

TranslateAnimation animation1 = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f, 
Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f); 
animation1.setDuration(200); 
animation1.setStartOffset(200); 
as.addAnimation(animation1); 

wave.startAnimation(as); 
+1

Это замечательно. Однако это, похоже, сериализует анимацию только для одного объекта. Если вам нужно сериализовать анимацию для разных объектов, вам придется использовать разные подходы. –

+0

это сработало для меня, но в неправильном порядке, анимация, которую я поставил, сначала заняла второе место, как ее решить? – underfilho

6

Существует еще один подход к достижению этой цели, которая может быть полезна, когда вам нужно анимировать много взглядов, один за другим. Вы можете использовать метод setStartOffset для установки задержки до начала анимации. Итак, если вы знаете, сколько времени потребуется для завершения вашей первой анимации, вы можете установить это как задержку для своей второй анимации. Это пример, где я анимированный шесть ImageButtons и шесть TextViews под ними один за другим:

public void animateButtons() { 
    // An array of buttons 
    int[] imageButtonIds = {R.id.searchButton, R.id.favoriteButton, R.id.responseButton, R.id.articleButton, R.id.resumeButton, R.id.subscribeButton}; 
    // Array of textViews 
    int[] textViewIds = {R.id.searchTextView, R.id.favoriteTextView, R.id.responseTextView, R.id.articleTextView, R.id.resumeTextView, R.id.subscribeTextView}; 

    int i = 1; 

    for (int viewId : imageButtonIds) { 

     ImageButton imageButton = (ImageButton) findViewById(viewId); 
     // Animation from a file fade.xml in folder res/anim 
     Animation fadeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade); 
     // Delay for each animation is 100 ms bigger than for previous one 
     fadeAnimation.setStartOffset(i * 100); 
     imageButton.startAnimation(fadeAnimation); 

     // The same animation is for textViews 
     int textViewId = textViewIds[i-1]; 
     TextView textView = (TextView) findViewById(textViewId); 
     textView.startAnimation(fadeAnimation); 

     i ++; 
    } 
} 

В моей res/anim папке у меня есть файл, называется fade.xml с этим содержимым:

<?xml version="1.0" encoding="utf-8"?> 

<!-- Fade animation with 500 ms duration --> 

<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:fromAlpha="0.0" android:toAlpha="1.0" 
     android:duration="500" /> 
+0

Хорошо спасибо –

+0

не работал для меня | -) fadeAnimation.setStartOffset изменяет корневую анимацию. есть ли какое-нибудь решение? – Solivan

6

также вы можете сделать это сам XML, используя атрибут android:startOffset, и есть examble:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <scale 
     android:duration="300" 
     android:fromXScale="0%" 
     android:fromYScale="0%" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:toXScale="100%" 
     android:toYScale="100%" /> 
    <alpha 
     android:duration="300" 
     android:fromAlpha="0" 
     android:toAlpha=".5" /> 
    <alpha 
     android:duration="300" 
     android:fromAlpha=".5" 
     android:startOffset="300" 
     android:toAlpha="1" /> 

</set> 
-1

Если йо u используйте код, вы можете позвонить по телефону

Animation.setStartOffset() 

чтобы отложить вторую анимацию.

Если вы используете xml, вы можете использовать свойство android:ordering="sequentially", чтобы две анимации выполнялись последовательно.

1

Создайте анимационный массив и используйте метод для создания AnimationSet.

Animation[] animations = { 
      getScaleAnimation(0.4f, 1.3f, 2000), 
      getScaleAnimation(1.3f, 1.0f, 500), 
      getScaleAnimation(0.4f, 1.3f, 1000), 
      getScaleAnimation(1.3f, 1.0f, 3000), 
      getScaleAnimation(0.4f, 1.3f, 500), 
      getScaleAnimation(1.3f, 1.0f, 1700), 
      getScaleAnimation(0.4f, 1.3f, 2100), 
      getScaleAnimation(1.3f, 1.0f, 3400) 
    }; 
    AnimationSet animationSet = addAnimationAr(animations); 
    view.startAnimation(animationSet); 

Метод:

public static AnimationSet addAnimationAr(Animation[] animations) { 
    AnimationSet animationSet = new AnimationSet(false); 
    long totalAnimationDuration = 0; 

    for (int i = 0; i < animations.length; i++) { 
     Animation a = animations[i]; 
     a.setStartOffset(totalAnimationDuration); 
     totalAnimationDuration += a.getDuration(); 
     animationSet.addAnimation(a); 
    } 

    return animationSet; 
} 
Смежные вопросы