2012-05-15 18 views
23

Ho due layout lineari che voglio eseguire due diverse animazioni su entrambi questi layout e allo stesso tempo.Come avviare due animazioni contemporaneamente in Android?

Ora funziona in modo sequenziale. io, dopo averne completato uno ne inizia un altro.

ecco il mio codice.

Animation inFromRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, +0.0f, 
        Animation.RELATIVE_TO_PARENT, 0.0f, 
        Animation.RELATIVE_TO_PARENT, 0.0f, 
        Animation.RELATIVE_TO_PARENT, 0.0f); 
      inFromRight.setDuration(500); 
      inFromRight.setInterpolator(new AccelerateInterpolator()); 

    Animation outtoLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, 0.0f, 
        Animation.RELATIVE_TO_PARENT, -1.0f, 
        Animation.RELATIVE_TO_PARENT, 0.0f, 
        Animation.RELATIVE_TO_PARENT, 0.0f); 
      outtoLeft.setDuration(500); 
      outtoLeft.setInterpolator(new AccelerateInterpolator()); 

    @Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.menu: 
          mainLayout.startAnimation(outtoLeft); 
       sideBar.startAnimation(inFromRight);     
       break; 
      } 
     } 

outtoLeft.setAnimationListener(new AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       mainLayout 
         .setLayoutParams(new LayoutParams(
           LayoutParams.FILL_PARENT, 
           LayoutParams.FILL_PARENT, 40)); 

      } 
     }); 

Grazie in anticipo!

+0

È tutto il tuo codice? Il modo in cui sono scritte entrambe le animazioni dovrebbe iniziare nello stesso momento. –

+0

No, ho anche ascoltatori di animazione. Dopo aver completato un'animazione, sto eseguendo alcune altre operazioni dell'interfaccia utente, è questo che influisce ..? Ho aggiornato il codice. – Noby

risposta

12

Penso che è necessario utilizzare un AnimationSet

http://developer.android.com/reference/android/view/animation/AnimationSet.html

Dal doc:

Represents a group of Animations that should be played together. The transformation of each individual animation are composed together into a single transform.

Questo link sorta di mostra come si suppone un AnimationSet da costruire/eseguiti: http://groups.google.com/group/android-developers/browse_thread/thread/9df24ac25f01cee9/6e0eac7802a541e3

+7

Penso che il set di animazione funzioni come combinazione di animazioni, non come animazione separata su viste separate. – Noby

+0

Hai ragione, ho letto male la domanda e ho pensato che stavi eseguendo le animazioni sullo stesso oggetto. – Gophermofur

1

Il modo per risolvere questo problema è utilizzare un AnimatorSet con oggetti Animator. Se siete preoccupati per la compatibilità a ritroso, è possibile utilizzare la libreria NineOldAndroids per portare l'API di nuovo tutta la strada ad Android 1.0

2

nella vostra attività

ImageView reusableImageView = (ImageView)findViewById(R.id.imageView1); 
reusableImageView.setImageResource(R.drawable.flag); 
reusableImageView.setVisibility(View.VISIBLE); 
Animation an = AnimationUtils.loadAnimation(this, R.anim.yourAnimation); 
reusableImageView.startAnimation(an); 

Poi, in yourAnimation.xml definire tutte le animazioni che voglio

<set 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:shareInterpolator="false"> 
<scale 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:fromXScale="1.0" 
    android:fromYScale="1.0" 
    android:toXScale="2.0" 
    android:toYScale="2.0" 
    android:duration="2500" /> 
<scale 
    android:startOffset="2500" 
    android:duration="2500" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:fromXScale="1.0" 
    android:fromYScale="1.0" 
    android:toXScale="0.5" 
    android:toYScale="0.5" /> 
<rotate 
    android:fromDegrees="0" 
    android:toDegrees="360" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:duration="5000" /> 
</set> 
1

Ho risolto l'avvio della seconda animazione in evento OnAnimationStart della prima animazione. Nel mio esempio, il layout di destra in sostituzione di quello di sinistra, entrambi si spostano a sinistra allo stesso tempo. Io uso la proprietà animate di una classe View http://developer.android.com/reference/android/view/View.html#animate() che è disponibile iniziando API v.12

leftLayout.animate() 
    .translationX(-leftLayout.getWidth()) // minus width 
    .setDuration(300) 
    .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      rightLayout.animate() 
        .translationX(-leftLayout.getWidth()) // minus width 
        .setDuration(300) 
        .setListener(new AnimatorListenerAdapter() { 
         @Override 
         public void onAnimationEnd(Animator animation) { 
          leftLayout.setVisibility(View.GONE); 
          leftLayout.setTranslationX(0f); // discarding changes 
          rightLayout.setTranslationX(0f); 
         } 
        }); 
     } 
}); 
Problemi correlati