2009-10-13 19 views
11

Cuando utilizo el widget Galería, ¿cómo puedo obtener las imágenes a escala dicen hasta & resplandor por haber sido seleccionados y reducido & ONU-Glow en ser seleccionada ?Android: ¿Animación en la vista de galería?

Todos los tutoriales que he visto tienen este efecto, pero no estoy capaz de verlo ...

¿Existe algún tipo de animación que tengo para insertarse en el Galería?

+0

estoy haciendo lo mismo pero no funciona en algunos dispositivos Android, si tiene esta animación en la vista de galería, envíeme el código. – Hasmukh

Respuesta

15

Espero que esto te ayude. Logro "simular" la solución de reducción/crecimiento con el widget Gallery. Desde que eliminaron el getScale(), las cosas se complicaron un poco. Creo que esta no es la mejor solución, pero al menos puedo vivir con eso.

Lo que he encontrado es que Gallery gestiona el enfoque extremadamente malo. Entonces, el primer enfoque fue agregar un detector de cambio de enfoque en el ImageView, pero no hubo suerte allí. El foco es un MESS allí ... en términos que, la imagen seleccionada no es la vista actualmente enfocada. He enviado un correo a la lista de distribución de android-developers sobre algún error en el API doc (con respecto al método focusSearch() y algunos contantes de enfoque).

aquí está mi solución a este problema:

Construir un recurso de la animación de 'crecer' la imagen:

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

Si no obtiene lo que quiere decir entonces se debe proceder a leer this

Ese será nuestro efecto 'crecer', y tendrá que guardarlo en: res/anim/grow.xml o cualquier nombre que le suites (pero siempre en res/dir anim).

se puede seguir la guía de recursos de here para crear una vista Gallery. El ImageAdapter construye un ImageView cada vez que el objeto Gallery llama getView(). Una solución alternativa podría implementar es la adición de una línea con el método getView() que identifica un View con un position, de esta manera:

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

Con esa línea añade al método del objeto ImageAdpatergetView(), a continuación, puede identificar de manera inequívoca que ver dentro de un oyente, por ejemplo:

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: Usted puede notar que todos los valores de la animación y de los parámetros de diseño ha sido elegido por mí en la mano. Esto es porque no voy a limpiar el código para ti.Y, esto es solo una solución al problema de MALO enfoque con este widget o el sistema de vista de Android. Si el enfoque estuviera bien, entonces, todo lo que tiene que hacer es establecer un oyente de cambio de enfoque que haga el gros/encogimiento cuando se enfoca/desenfoca.

Espero que esto puede ayudar a encontrar un camino alrededor de su problema,

Saludos,

Nueva EDIT: Este es el oyente he puesto, también agregué la línea i.clearAnimation() en el método 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

EDITAR: El elenco de 'ImageView' fue en vano .. – Sebastian

+0

¡increíble! ¡Gracias! – davs

+0

+1 No he visto esto. Aceptado como respuesta. Gracias por tu tiempo chicos! Muy útil. – Legend

4

Es necesario utilizar un ImageSwitcher. El ImageSwitcher tiene métodos para configurar las animaciones de entrada y salida (cuando la imagen se selecciona y se deselecciona, o se selecciona y reemplaza).

El following link tiene un buen tutorial sobre cómo usarlo en conjunto con la Galería.

+0

Guau ... ¡Es un sitio increíble ...! Gracias una tonelada ... – Legend

+0

Lo siento, no lo noté, pero todavía no pude encontrar una manera de escalar y escalar las imágenes en el mismo selector de imágenes ... Lo que quiero decir es la parte superior que es visible ... Cuando se hace clic, debería darnos un tamaño normal o un tamaño reducido ... ¿Me estoy perdiendo alguna solución trivial? – Legend

2

he implementado una animación similar como esto:

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

    }); 
Cuestiones relacionadas