2010-04-28 7 views
9

Remarque: À partir de Jellybean, le widget de la galerie est obsolète. Un ViewPager doit être utilisé à la place. Je voudrais déplacer par programme entre les images dans le widget Galerie, avec l'animation.Android: animation par programme entre les images du widget Galerie

Je peux modifier l'image actuellement affichée en utilisant la méthode setSelection(int position), mais qui ne s'anime pas. Ensuite, il y a setSelection(int position, bool animate) mais le booléen supplémentaire à la fin ne semble pas faire quoi que ce soit.

Dans le source of Gallery, il semble qu'il peut gérer les touches DPAD, donc une solution de rechange que j'ai imaginée était de fausser les touches. Par exemple.

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT)) 

Cependant, je ne peux pas obtenir ce travail pour une raison quelconque. Quelqu'un a essayé cela?

Je remarque trois des méthodes du widget que j'aimerais utiliser moveNext(), movePrevious() et scrollToChild() sont tous privés et inutilisables.

Est-ce que quelqu'un sait comment je pourrais faire cela?

Répondre

18

Il suffit d'appeler le gestionnaire de presse clé pour la galerie directement:

public boolean onKeyDown(int keyCode, KeyEvent event) 

-à-dire

Gallery gallery = ((Gallery) findViewById(R.id.gallery)); 

gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(0, 0)); 

Une chose importante - cette solution ne fonctionne que si l'enfant qui est à gauche/droite a déjà été créé, ce qui signifie qu'il doit être «visible». Si vous avez votre image en plein écran, pensez à définir l'espacement à -1.

+2

Ne semble pas fonctionner sur la sous-classe Galerie, aucune idée de qui est le cas? –

+0

Ne semble pas fonctionner du tout sur mon HTC Desire. Juste en l'utilisant comme une galerie normale, déclenchée par un bouton, appuyez sur – Kurru

+0

Ce code fonctionne-t-il? Je ne peux pas le faire bouger. Est-ce que je manque quelque chose? Et aussi, comment puis-je le faire bouger à une certaine position, en l'utilisant autant de fois que mon pos dans un "pour"? – AnTz

2

Utilisez gallery.setSelected (int); Voici un exemple simple.


public class Splash extends Activity { 

    ArrayList objects = new ArrayList(); 
    Gallery g; 
    int i = 0; 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.photos); 
     g = (Gallery) findViewById(R.id.gallery); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     objects.add(getResources().getDrawable(R.drawable.icon)); 
     g.setAdapter(new CustomAdapter(this, objects)); 
     g.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView arg0, View arg1, 
        int arg2, long arg3) { 
       Log.i("", "selected " + arg2); 
      } 

      @Override 
      public void onNothingSelected(AdapterView arg0) {} 
     }); 
    } 

    @Override 
    public void onBackPressed() { 
      g.setSelection(i++); 
    } 

     private class CustomAdapter extends BaseAdapter { 

     private Context mCtx; 
     private List objects; 

     public int getCount() { 
      return this.objects.size(); 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public CustomAdapter(Context context, ArrayList objects) { 
      super(); 
      mCtx = context; 
      this.objects = objects; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView row = (ImageView) convertView; 
      if (row == null) { 
       row = new ImageView(mCtx); 
       row.setBackgroundDrawable(objects.get(position)); 
      } 
      return row; 
     } 
    } 
} 
+0

Salut - Je vous remercie pour votre réponse, mais votre solution ne semble pas fournir l'animation lors du changement entre les images sélectionnées. L'animation est une exigence. – bdls

1

En fin de compte, j'ai écrit ma propre version du widget Gallery avec l'aide du code à this site.

J'ai alors écrit ma propre méthode qui utilise mFlingRunnable.startUsingDistance(distance);

Maintenant, je peux animer la galerie programmation entre les images.

+2

Ne supposez pas que vous pourriez poster ou lier ce code? – Kurru

3

Vous pouvez animer en utilisant dispatchKeyEvent ou en appelant onFling directement.

Voici un exemple de code pour dispatchKeyEvent:

KeyEvent evtKey = new KeyEvent(0, KeyEvent.KEYCODE_DPAD_RIGHT); 
dispatchKeyEvent(evtKey);