8

J'ai actuellement un programme Android qui ajoute par programmation des vues à un LinearLayout. Je voudrais que ces points de vue soient animés et que je ne trouve pas de bonnes ressources pour trouver comment le faire.Android: LinearLayout addView Animation

Quelqu'un pourrait-il me diriger dans la bonne direction?

Répondre

-2

Vous pouvez utiliser ViewFlipper et définir des animations à partir de là, vous pouvez jeter un oeil à ce tutorial . Bonne chance.

7

Il est une question très ancienne, mais toujours intéressant: vous pouvez utiliser l'attribut android:animateLayoutChanges="true"

Par exemple:

<LinearLayout 

       android:orientation="horizontal" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:animateLayoutChanges="true" 
       /> 
4

Cela peut être fait avec Scenes and Transitions API.

cadre nous donne trois types Transition de la boîte: Fade, Slide et Explode, mais vous pouvez aussi créer votre type personnalisé de transition s'étendant Visibility classe et prépondérants des méthodes appropriées.

Ainsi, ayant une ViewGroup, nous pouvons le faire:

viewGroup.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(final View v) { 
     Transition t = null; 
     if (i == 1) { 
      t = new Fade(); 
     } else if (i == 2) { 
      t = new Slide(Gravity.BOTTOM); 
     } else if (i == 3) { 
      t = TransitionInflater.from(v.getContext()) 
            .inflateTransition(R.transition.my_transition); 
     } 

     Button button = new Button(v.getContext()); 
     button.setText("My button " + i++); 

     TransitionManager.beginDelayedTransition(customLayout, t); 
     viewGroup.addView(button); 
    } 
}); 

my_transition.xml suit:

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" 
       android:duration="3000" 
       android:interpolator="@android:interpolator/fast_out_slow_in"> 

    <fade/> 
    <slide android:slideEdge="bottom"/> 

</transitionSet> 

Nous allons obtenir ce résultat:

enter image description here

Notez que nous devons effectuer TransitionManager.beginDelayedTransition() avant toute modification de la mise en page (c.-à-d. avant que addView() soit appelé). Ensuite, le cadre prendra soin du reste.

Il existe également une autre surcharge TransitionManager.beginDelayedTransition(ViewGroup), où vous n'avez pas besoin de spécifier la transition exacte que vous souhaitez appliquer, et le système exécutera l'animation AutoTransition, qui fondra et changera les limites de la vue animée.


Mise à jour résument de la conversation dans les commentaires

cadre de TransitionManager

est disponible à partir de l'API 19 et entièrement pris en charge de l'API 21 (en disant bien que je veux dire par exemple Slide transition est disponible à partir de l'API 21). Bien qu'il existe support package available, mais il ne rétroportage pas toutes les fonctionnalités. Alternativement, vous pouvez passer à TransitionsEverywhere bibliothèque, qui rétroport tout jusqu'à Android 4.0.

+0

Je le veux quand j'ajoute comme ceci 'pour (int i = 0; i

+0

Placez 'TransitionManager.beginDelayedTransition()' avant la boucle 'for'. – azizbekian

+0

Je suis en train d'ajouter my_transition.xml J'ai ** ** android: interpolator/fast_out_slow_in nécessite le niveau API 21 (min actuel est 15) ** sur 'android: interpolator =" @ android: interpolator/fast_out_slow_in "' –

1

Essayez

1. vue Ajouter à la disposition linéaire

linearLayout.addView(customView); 

2. Ajouter slide_up.xml-res/anim dossier

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:fillAfter="true"> 

    <translate 
    android:duration="500" 
    android:fromYDelta="100%" 
    android:toYDelta="0%" /> 
</set> 

3. Appliquer l'animation juste après l'ajout vue

Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up); 
customView.startAnimation(animation); 

Si vous souhaitez animer des vues un par un, puis utilisez les lignes suivantes

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      linearLayout.addView(customView); 
      Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up); 
      customView.startAnimation(animation); 
     } 
}, 500); 
+0

Je veux glisser un à la fois, mais cette diapositive tout customeview together.My 'linearLayout.addView (customView);' ajouter dans la boucle –

+0

Vous pouvez ajouter un délai, j'ai mis à jour la réponse. – Pehlaj

+0

Nous pouvons y parvenir en utilisant Handler correctement – Pehlaj