2010-04-28 18 views
9

Nota: A partire da Jellybean il widget della galleria è obsoleto. Dovrebbe essere usato un ViewPager.Android: animare programmaticamente tra le immagini nel widget Galleria


Mi piacerebbe spostarsi a livello di codice tra le immagini nel widget Galleria, con animazione.

Posso modificare l'immagine attualmente visualizzata utilizzando il metodo setSelection(int position), che tuttavia non è animato. Poi c'è lo setSelection(int position, bool animate) ma il booleano extra alla fine non sembra fare nulla.

Nel numero source of Gallery sembra che sia in grado di gestire i tasti di pressione DPAD, quindi una soluzione che ho pensato è stata quella di simulare i tasti premuti. Per esempio.

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

Tuttavia non riesco a farlo funzionare per qualche motivo. Qualcuno ha provato questo?

Ho notato che tre dei metodi del widget che mi piacerebbe usare moveNext(), movePrevious() e scrollToChild() sono tutti privati ​​e inutilizzabili.

Qualcuno sa come potrei essere in grado di farlo?

risposta

18

Basta chiamare il gestore premere il tasto per la galleria direttamente:

public boolean onKeyDown(int keyCode, KeyEvent event) 

cioè

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

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

Una cosa importante - questa soluzione funziona solo se il bambino che si trova sulla sinistra/destra è stato già creato, il che significa che deve essere "visibile". Se hai la tua immagine a schermo intero, considera di impostare la spaziatura sul valore -1.

+2

Non sembra funzionare nella galleria sottoclasse, non ha idea di chi sia? –

+0

Non sembra funzionare affatto sul mio HTC Desire. Basta usarlo come normale Gallery, attivato da un pulsante premere – Kurru

+0

Questo codice funziona? Non posso farlo muovere. Mi manca qualcosa? E inoltre, come posso farlo muovere in una certa posizione, usandolo tutte le volte che la mia posizione in un "per"? – AnTz

2

Utilizzare gallery.setSelected (int); Qui c'è un semplice esempio.


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

Hi - Grazie per la risposta, ma la soluzione non sembra fornire l'animazione quando si passa da immagini selezionate. L'animazione è un requisito. – bdls

1

Alla fine ho scritto la mia versione del widget Galleria con l'aiuto del codice a this site.

Allora ho scritto il mio metodo che usa mFlingRunnable.startUsingDistance(distance);

Ora posso programmazione animare la galleria tra le immagini.

+2

Non supponete di poter postare o collegare questo codice? – Kurru

3

È possibile eseguire l'animazione utilizzando dispatchKeyEvent o chiamando direttamente onFling.

Ecco codice di esempio per dispatchKeyEvent:

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