29 votes

Comment créer une animation de traduction pour chaque élément de la liste ?

J'ai un listview avec une méthode override getView pour le remplir. Maintenant, je veux que chaque élément de la liste s'anime ou se déplace du côté droit de l'écran vers le côté gauche où l'élément doit se trouver. de l'écran vers le côté gauche où l'élément devrait normalement apparaître.

l'animation de chaque élément ne doit pas démarrer en même temps, elle doit être retardée de quelques ms avant le déplacement des autres éléments...

Eh bien, c'est mon cours d'adaptation :

public class MyAdapter extends ArrayAdapter<String>{

    private Context context;
    private String[] info;

    public MyAdapter(Context context, int resource,
            String[] objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        this.context = context;
        this.info = objects;

    }

    protected class RowViewHolder {
        public TextView text1;
        public CheckBox cb;
        public String ss;
    }

    @Override
    public View getView(int pos, View inView, ViewGroup parent) {
           View vix = inView;

           RowViewHolder holder;

           if (vix == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vix = inflater.inflate(R.layout.check_list, null);
           }    
                holder = new RowViewHolder();

                holder.text1 = (TextView) vix.findViewById(R.id.info_group);
                holder.text1.setText(info[pos]);

                holder.ss = info[pos];

                holder.cb = (CheckBox) vix.findViewById(R.id.check);
                holder.cb.setTag(holder.ss);
                holder.cb.setOnCheckedChangeListener(CbListen);

                vix.setTag(holder);

           return vix;
    }

    private OnCheckedChangeListener CbListen = new OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton com, boolean pool) {
            // TODO Auto-generated method stub
            String state = (com.getTag()).toString();

            if(com.isChecked()){
                System.out.println(state+" CHECKED");
            }else{
                System.out.println(state+" UNCHECKED");
            }
        }
    };

}

Une idée ? :)

UPDATE

Eh bien, c'est sûrement le cas ! LOL :p

téléchargez juste ces ApiDemos "comme ce qu'a dit Farhan" et vous trouverez une sorte d'échantillon de LayoutAnimation2 dans la vue du paquet.

ici, chaque élément de la liste est animé pour se remplir vers le bas par translation-animation pendant que l'alpha change respectivement.

Voici ce que je fais pour mon affaire :

AnimationSet set = new AnimationSet(true);

    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(500);
    set.addAnimation(animation);

    animation = new TranslateAnimation(
        Animation.RELATIVE_TO_SELF, 50.0f,Animation.RELATIVE_TO_SELF, 0.0f,
        Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f
    );
    animation.setDuration(1000);
    set.addAnimation(animation);

    LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);

    group_list.setLayoutAnimation(controller);
Je l'ai placé sous ma fonction setAdapter(), vous pouvez le rendre plus agréable avec des effets d'accélération et de décélération, etc.

p

7voto

Gud Batta Points 21

@ utilisateur724861 a donné la réponse parfaite ! Cependant, j'ai trouvé qu'il était difficile de savoir où mettre le code qu'il a suggéré... J'ai mis ce code dans mon site web. Activité ListFragment comme suit

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);        

    AnimationSet set = new AnimationSet(true);
    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(300);
    set.addAnimation(animation);

    /*animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 50.0f,
            Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
            0.0f, Animation.RELATIVE_TO_SELF, 0.0f);
    animation.setDuration(10);
    set.addAnimation(animation); just comment if you don't want :) */ 
    LayoutAnimationController controller = new LayoutAnimationController(
            set, 0.5f);

    lv.setLayoutAnimation(controller);

    adapter = new LazyAdapter(getActivity(), numResults, nodes, tabType);
    setListAdapter(adapter);
}

3voto

Dori Points 4011

Utilisation de LayoutAnimations !

Dans la documentation, vous pouvez définir via Android:layoutAnimation attr xml

voir ici

2voto

Milad Points 13

l'animation de chaque élément ne doit pas commencer en même temps

Si vous le voulez, vous pouvez faire quelque chose comme ça :

layout_controller.xml :

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animation="@anim/scale" />

scale.xml :

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<scale
  android:fromXScale="0.1"
  android:toXScale="1"
  android:fromYScale="0.1"
  android:toYScale="1.0"
  android:duration="800"
  android:pivotX="10%"
  android:pivotY="10%"
  android:startOffset="100" />
</set>

Puis, dans votre Java, après SetListAdapter(), collez le code suivant :

LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(
 this, R.anim.layout_controller);
getListView().setLayoutAnimation(controller);

Notez que "Android:delay" fait démarrer les animations avec un délai après la précédente.

1voto

Tarik Fakhouri Points 20

GetView() remplit chaque élément de votre activité. Essayez de créer votre animation dans getView avec Minuterie .

1voto

Yasir Points 30
package com.Animation1;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView;
import java.util.ArrayList;

public class Animation1Activity extends ListActivity implements 
                                AdapterView.OnItemSelectedListener {
    Animation anim = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        anim = AnimationUtils.loadAnimation( this, R.anim.magnify );
        setContentView(R.layout.main);
        ListView v = getListView();     // set up item selection listener
        v.setOnItemSelectedListener( this );    // see OnItemSelectedListener methods below
        ArrayList<String> items = new ArrayList<String>();
        items.add( "Red" );
        items.add( "Grey" );
        items.add( "Cyan" );
        items.add( "Blue" );
        items.add( "Green" );
        items.add( "Yellow" );
        items.add( "Black" );
        items.add( "White" );
        ArrayAdapter itemsAdapter = new ArrayAdapter( this, R.layout.row, items );
        setListAdapter( itemsAdapter );
    }

    protected void onListItemClick(ListView l, 
                                    View v, 
                                    int position,
                                    long id) {
      v.startAnimation( anim );
    }

// --- AdapterView.OnItemSelectedListener methods --- 
    public void onItemSelected(AdapterView parent, 
            View v, 
            int position, 
            long id) {
      v.startAnimation( anim );
    }

    public void onNothingSelected(AdapterView parent) {}
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X