2009-10-13 4 views
11

Gdy używam widżet Galeria, w jaki sposób uzyskać obrazy powiedzieć skala się & poświata on wybiera i zmniejszony & un-glow na bycie niezaznaczoną?Android: animacja w widoku galerii?

Wszystkie tutoriale widziałem taki efekt, ale nie jestem w stanie go zobaczyć ...

Czy istnieje jakiś rodzaj z animacji że mam dołączyć do Galerii?

+0

robię to samo, ale nie działa ono na niektórych urządzeniach z Androidem, jeśli masz tę animację w widoku galerii, proszę wyślij mi kod. – Hasmukh

Odpowiedz

15

Mam nadzieję, że jest to pomocne. Udaje mi się "symulować" rozwiązanie zmniejszania/powiększania za pomocą widgetu Gallery. Ponieważ usunęli getScale(), sprawy nieco się komplikują. Myślę, że to nie jest najlepsze rozwiązanie, ale przynajmniej mogę z tym żyć.

Co znalazłem to, że Gallery zarządza ogniskiem NIEZWYKLE NIEPRAWIDŁOWYM. Tak więc pierwszym podejściem było dodanie detektora zmiany ogniskowej na wyświetlanym ekranie, ale bez powodzenia. Focus to MESS tam ... w kategoriach, że wybrany obraz to nie jest aktualnie skupiony widok. Wysłałem wiadomość e-mail do listy mailingowej programistów Androida na temat błędu w dokumentacji interfejsu API (w odniesieniu do metody focusSearch() i niektórych ustawień ostrości).

Oto moje rozwiązanie tego problemu:

zbudować zasób animacji „rosnąć” obraz:

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

Jeśli nie dostać co to znaczy wtedy należy przystąpić do zapoznania this

To będzie nasz efekt "wzrostu", a będziesz musiał go zapisać w: res/anim/grow.xml lub jakiejkolwiek nazwie (ale zawsze w re/anim reż).

Możesz śledzić przewodnik zasobów od here, aby utworzyć widok Gallery. Model ImageAdapter buduje obiekt ImageView za każdym razem, gdy obiekt Gallery wywołuje getView(). Jeden obejście można zaimplementować jest dodanie odpowiedniego wiersza do metody getView() że identyfikuje View z position, w ten sposób:

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

Z tej linii dodany do metody obiektu ImageAdpatergetView() można następnie jednoznacznie zidentyfikować, że zobaczyć w słuchacza, na przykład:

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

    } 
    }); 

UWAGA: można zauważyć, że wszystkie wartości z animacją i od parametrów układu zostały wybrane przeze mnie pod ręką. To dlatego, że nie zamierzam czyścić kodu dla ciebie.Jest to tylko obejście problemu z problemem ZŁY problem z tym widżetem lub systemem widoku Androida. Jeśli fokus był w porządku, wszystko, co musisz zrobić, to ustawić detektor zmiany ogniskowej, który sprawia, że ​​gros/shrink, gdy uzyskał ostrość/nieostre.

Mam nadzieję, że to może pomóc Ci znaleźć drogę do swojego problemu,

Pozdrowienia,

New EDIT: To jest słuchacz mam ustawić, dodałem także linię i.clearAnimation() w metodzie 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

EDYCJA: Rzucanie do 'ImageView' było daremne. – Sebastian

+0

niesamowite! dzięki! – davs

+0

+1 Nie widziałem tego. Zaakceptowany jako odpowiedź. Dzięki za czas, chłopaki! Bardzo pomocne. – Legend

4

Musisz użyć ImageSwitchera. ImageSwitcher posiada metody do ustawiania animacji w trakcie i na zewnątrz (gdy obraz jest wybrany i odznaczony lub wybrany i zastąpiony).

Urządzenie following link ma dobry samouczek, jak go używać w połączeniu z Galerią.

+0

Wow ... To niesamowita strona ...! Dziękuję za ... – Legend

+0

Niestety, nie zauważyłem tego, ale nadal nie mogłem znaleźć sposobu na powiększenie skali i skalowanie obrazów w samym obrazie ... Co mam na myśli to górna część, która jest widoczna ... Po kliknięciu, powinien dać nam normalny rozmiar, inny niż mniejszy rozmiar ... Czy brakuje mi jakiegoś trywialnego rozwiązania? – Legend

2

I wdrożone podobną animację takiego:

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

    });