2010-11-16 14 views
7

J'essaie de faire plusieurs traductions simultanément sur Android.Traductions simultanées sur Android

J'ai 2 boutons ou plus sur une mise en page (tous de la même taille), et quand j'appuie sur un, je veux que les autres sortent de l'écran. J'ai fait une application de test pour essayer d'implémenter ce comportement.

Là-dessus, je me suis fixé un écouteur sur clic d'un bouton pour tester, quelque chose comme:

button.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View view) { 
     Button toMove = (Button) findViewById(R.id.button_test2); 
     Button toMove2 = (Button) findViewById(R.id.button_test3); 

     AnimationSet set = new AnimationSet(true); 

     TranslateAnimation anim = new TranslateAnimation(0, -toMove 
      .getWidth(), 0, 0); 
     anim.setFillAfter(true); 
     anim.setDuration(1000); 

     toMove.setAnimation(anim); 
     toMove2.setAnimation(anim); 

     set.addAnimation(anim); 

     set.startNow(); 
    } 

La vue:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <Button android:id="@+id/button_test" android:layout_width="200px" 
     android:layout_height="50px" android:text="@string/hello" /> 

    <Button android:id="@+id/button_test2" android:layout_width="200px" 
     android:layout_height="50px" android:text="@string/hello"/> 

    <Button android:id="@+id/button_test3" android:layout_width="200px" 
     android:layout_height="50px" android:text="@string/hello"/> 

</LinearLayout> 

La chose est que les deux boutons démarrer l'animation , un peu après l'autre. J'ai lu que c'est dû à getDelayForView() qui renvoie des retards différents de chacun. Est-il possible de déplacer 2 boutons ou plus simultanément?

Google n'a pas été très utile: - \

Répondre

11

Problème:

Il semble que setAnimation va acutally démarrer l'animation et probablement de manière asynchrone. Cependant, il peut y avoir un verrou sur la définition de l'animation pour la deuxième vue. Il doit y avoir un répartiteur car le réglage de l'animation pour les boutons dans un ordre différent n'affecte pas le fait que le bas est plus rapide.

La solution est d'empêcher ce blocage hypothétique en créant deux animations individuelles.

code:

public void onClick(View view) { 
    Button toMove = (Button) findViewById(R.id.button_test2); 
    Button toMove2 = (Button) findViewById(R.id.button_test3); 

    TranslateAnimation anim = new TranslateAnimation(0, -toMove 
      .getWidth(), 0, 0); 
    anim.setFillAfter(true); 
    anim.setDuration(1000); 

    TranslateAnimation anim2 = new TranslateAnimation(0, -toMove 
      .getWidth(), 0, 0); 
    anim2.setFillAfter(true); 
    anim2.setDuration(1000); 

    //THERE IS ONE MORE TRICK 

    toMove.setAnimation(anim); 
    toMove2.setAnimation(anim2); 
} 

Note:

Dans le //THERE IS ONE MORE TRICK, vous pouvez ajouter le code suivant pour veiller à ce qu'ils se déplacent ensemble. Il doit toujours y avoir un décalage de 1 milliseconde environ.

long time =AnimationUtils.currentAnimationTimeMillis(); 

//This invalidate is needed in new Android versions at least in order for the view to be refreshed. 
toMove.invalidate(); 
toMove2.invalidate(); 
anim.setStartTime(time); 
anim2.setStartTime(time); 
+0

cela ne fonctionne pas de moi ??? –