2009-10-13 5 views
11

Quando uso il widget Galleria, come faccio ad ottenere le immagini per dire scala fino & bagliore su essere selezionati e ridimensionati & non-bagliore sull'essere non selezionato?Android: animazione nella vista galleria?

Tutti i tutorial che ho visto hanno questo effetto, ma io non sono in grado di vederlo ...

C'è una sorta di un un'animazione che devo allegare alla Galleria?

+0

Sto facendo la stessa cosa ma non funziona su alcuni dispositivi Android, se hai ottenuto questa animazione in galleria, mandami il codice. – Hasmukh

risposta

15

Spero che questo sia utile. Riesco a "simulare" la soluzione shrink/grow con il widget Gallery. Da quando hanno rimosso lo getScale(), le cose si complicano un po '. Penso che non sia la soluzione migliore, ma almeno posso conviverci.

Quello che ho trovato è che Gallery gestisce la messa a fuoco ESTREMAMENTE CATTIVO. Quindi, il primo approccio è stato quello di aggiungere un ascoltatore di cambiamento di messa a fuoco sul ImageView visualizzato, ma senza fortuna lì. Focus è un MESS lì ... in termini, l'immagine selezionata non è la vista attualmente focalizzata. Ho inviato una mail alla mailing list degli sviluppatori android per alcuni errori sul doc dell'API (per quanto riguarda il metodo focusSearch() e alcuni contesti di attivazione).

Ecco la mia soluzione a questo problema:

Costruire una risorsa di animazione a 'crescere' l'immagine:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
     android:fromXScale="1.0" 
     android:toXScale="1.10" 
     android:fromYScale="1.0" 
     android:toYScale="1.10" 
     android:duration="300" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:fillAfter="false"/> 

Se non si ottiene che cosa significa allora si dovrebbe procedere alla lettura this

Questo sarà il nostro effetto di "crescita" e sarà necessario salvarlo in: res/anim/grow.xml o in qualsiasi altro nome (ma sempre nella directory res/anim).

È possibile seguire la guida delle risorse da here per creare una vista Gallery. Il ImageAdapter crea un ImageView ogni volta che l'oggetto Gallery chiama getView(). Una soluzione è possibile implementare è aggiunta una riga al metodo getView() che identifica un View con position, in questo modo:

... 
i.setId(position); 
... 

Con tale linea aggiunto al metodo dell'oggetto ImageAdpatergetView(), si può quindi inequivocabilmente che visualizzare all'interno di un ascoltatore, per esempio:

g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    public void onItemSelected (AdapterView<?> parent, View v, int position, long id) { 
     Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow); 

     View sideView = parent.findViewById(position - 1); 
     if (sideView != null) 
      ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100)); 

     sideView = parent.findViewById(position + 1); 
     if (sideView != null) 
      ((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100)); 

     v.startAnimation(grow); 
     v.setLayoutParams(new Gallery.LayoutParams(170, 150)); 
    } 

    public void onNothingSelected (AdapterView<?> parent) { 
     System.out.println("NOTHING SELECTED"); 

    } 
    }); 

NOTA: Si può notare che tutti i valori di animazione e da parametri di layout è stato scelto da me a portata di mano. Questo perché non ho intenzione di pulire il codice per te.E, questo è solo un modo per risolvere il problema di attenzione BAD con questo widget o il sistema di visualizzazione di Android. Se la messa a fuoco era OK, quindi, tutto ciò che devi fare è impostare un listener di cambiamento della messa a fuoco che faccia il gros/restringa quando ha il focus/unfocused.

Spero che questo può aiutare a trovare un modo per aggirare per il vostro problema,

saluti,

nuovo EDIT: Questo è l'ascoltatore che ho impostato, ho aggiunto anche la linea i.clearAnimation() nel metodo getView() :

private class SelectListener implements AdapterView.OnItemSelectedListener { 
    private Animation grow; 
    private int last; 

    public SelectListener() { 
     grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow); 
     last = 0; 
    } 

    public void onItemSelected (AdapterView<?> parent, View v, int position, long id) { 
     View sideView = parent.findViewById(last); 
     if (sideView != null && last != position) 
      sideView.clearAnimation(); 

     v.startAnimation(grow); 
     last = position; 
    } 

    public void onNothingSelected (AdapterView<?> parent) { 
    } 
} 
+0

EDIT: Il cast di 'ImageView' è stato inutile .. – Sebastian

+0

fantastico! Grazie! – davs

+0

+1 Non ho visto questo. Accettato come risposta Grazie per il tuo tempo ragazzi! Molto utile. – Legend

4

È necessario utilizzare uno ImageSwitcher. ImageSwitcher ha metodi per impostare le animazioni di entrata e uscita (quando l'immagine è selezionata e deselezionata, o selezionata e sostituita).

Il following link ha un buon tutorial su come utilizzarlo in congiunzione con la Galleria.

+0

Wow ... È un sito fantastico ...! Grazie mille ... – Legend

+0

Mi spiace di non averlo notato, ma non riesco ancora a trovare un modo per ridimensionare e ridimensionare le immagini nello stesso browser delle immagini ... Ciò che intendo è la parte superiore che è visibile ... Quando cliccato, dovrebbe darci una dimensione normale altrimenti una dimensione ridotta ... Mi manca qualche soluzione banale? – Legend

2

ho implementato un'animazione simile come questo:

final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink); 
shrink.setFillAfter(true); 

gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      // This iterates through the views which are currently displayed on screen. 
      for (int k=0; k<gallery.getChildCount(); k++){ 
       // Do whatever else you want, here. 
       // This is how you get a particular element of a view 
       ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background); 

       //clear animation 
       gallery.getChildAt(k).clearAnimation(); 

      } 

      // Scale the selected one 
      view.startAnimation(shrink); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) {} 

    });