2009-10-13 19 views
11

Als ich die Gallery Widget verwenden, wie bekomme ich die Bilder Skala bis & leuchten auf gewählt wird, sagen und abgespeckte & un-leuchten auf nicht ausgewählten zu sein?Android: Animation in der Galerieansicht?

Alle Tutorials Ich habe haben diesen Effekt gesehen, aber ich bin nicht in der Lage, es zu sehen ...

Gibt es irgendeine Art eines Animation, die ich zum Gallery befestigen haben?

+0

Ich mache dasselbe, aber es funktioniert nicht in einigen Android-Geräten, wenn Sie diese Animation in der Galerieansicht erreichen, senden Sie mir bitte Code. – Hasmukh

Antwort

15

Ich hoffe, dies ist hilfreich. Ich schaffe es, die Schrumpf-/Wachstumslösung mit dem Gallery Widget "zu simulieren". Seit sie die getScale() entfernt haben, werden die Dinge ein bisschen kompliziert. Ich denke, das ist nicht die beste Lösung, aber zumindest kann ich damit leben.

Was ich gefunden habe ist, dass Gallery verwaltet den Fokus EXTREM SCHLECHT. Also, der erste Ansatz war, einen Fokus-Change-Listener auf der ImageView angezeigt, aber kein Glück dort. Der Fokus ist ein MESS dort ... in dem Sinne, dass das ausgewählte Bild nicht die aktuell fokussierte Ansicht ist. Ich habe eine Mail an die Mailingliste von androider-developers über einen Fehler im API-Dokument gesendet (bezüglich der Methode focusSearch() und einiger Fokus contants).

Hier ist meine Lösung für dieses Problem:

Erstellen einer Animation Ressource ‚wachsen‘ das Bild:

<?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"/> 

Wenn Sie nicht bekommen, was das bedeutet, dann sollten Sie vorgehen this

lesen

Das wird unser 'grow'-Effekt sein, und Sie müssen es speichern in: res/anim/grow.xml oder welcher Name auch immer es Ihnen (aber immer in res/anim dir) entspricht.

Sie können dem Ressourcenleitfaden von here folgen, um eine Gallery Ansicht zu erstellen. Die ImageAdapter erstellt eine ImageView jedes Mal, wenn das Gallery Objekt getView() ruft. Eine Abhilfe Sie implementieren könnte, ist das Hinzufügen einer Zeile zu dem getView() Methode, die eine View mit einem position identifiziert, auf diese Weise:

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

Mit dieser Zeile hinzugefügt, um die getView() Methode des ImageAdpater Objekt können Sie dann identifizieren eindeutig, dass Ansicht innerhalb eines Zuhörers, zum Beispiel:

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"); 

    } 
    }); 

Hinweis: Sie können feststellen, dass alle Werte von Animationen und von Layout-Parameter werden von mir zur Hand gewählt worden. Das liegt daran, dass ich den Code für Sie nicht bereinige.Und das ist nur eine Umgehung des BAD-Fokusproblems mit diesem Widget oder dem Android-Ansichtssystem. Wenn der Fokus in Ordnung war, müssen Sie nur einen Fokuswechsel-Listener setzen, der die Gros/Shrinks macht, wenn der Fokus/nicht fokussiert ist.

Ich hoffe, dies kann Ihnen helfen, einen Weg, um für Ihr Problem zu finden,

Grüße,

New EDIT: Dies ist der Hörer ich gesetzt habe, habe ich auch die Linie i.clearAnimation() im getView() Verfahren :

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: Die Besetzung zu 'ImageView' war umsonst .. – Sebastian

+0

genial! Vielen Dank! – davs

+0

+1 Das habe ich nicht gesehen. Als Antwort akzeptiert. Danke für deine Zeit Jungs! Sehr hilfreich. – Legend

4

Sie müssen einen ImageSwitcher verwenden. Der ImageSwitcher verfügt über Methoden zum Festlegen der In- und Out-Animationen (wenn ein Bild ausgewählt und abgewählt oder ausgewählt und ersetzt wird).

Die following link hat ein gutes Tutorial, wie man es in Verbindung mit der Galerie verwendet.

+0

Wow ... Das ist eine tolle Seite ...! Danke eine Tonne ... – Legend

+0

Sorry, ich habe es nicht bemerkt, aber ich konnte immer noch keine Möglichkeit finden, die Bilder im Bildwechsler selbst zu skalieren und zu verkleinern ... Was ich meine, ist der obere Teil, der sichtbar ist ... Wenn sie angeklickt wird, sollte sie uns eine normale Größe oder eine kleinere Größe geben ... Vermisse ich eine triviale Lösung? – Legend

2

ich implementiert eine ähnliche Animation wie folgt aus:

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) {} 

    });