2009-10-13 9 views
11

Lorsque j'utilise le widget Gallery , comment puis-je obtenir les images à dire échelle jusqu'à & lueur avoir été choisi et vers le bas & mis à l'échelle un lueur d'être désélectionné?Android: Animation dans la galerie?

Tous les tutoriels que j'ai vu ont cet effet, mais je ne suis pas en mesure de le voir ...

Y at-il une sorte d'animation que je dois joindre à la Galerie ?

+0

je fais la même chose mais il ne fonctionne pas dans certains appareils Android, si vous avez réalisé cette animation dans la galerie, s'il vous plaît envoyez-moi du code. – Hasmukh

Répondre

15

J'espère que cela vous sera utile. Je parviens à "simuler" la solution de rétrécissement/croissance avec le widget Gallery. Depuis qu'ils ont enlevé le getScale(), les choses deviennent un peu compliquées. Je pense que ce n'est pas la meilleure solution du tout, mais au moins je peux vivre avec.

Ce que j'ai trouvé est que Gallery gère le focus EXTREMEMENT MAUVAIS. Ainsi, la première approche consistait à ajouter un écouteur de changement de focus sur le ImageView affiché, mais pas de chance là-bas. Focus est un MESS là ... en termes que, l'image sélectionnée n'est pas la vue actuellement focalisée. J'ai envoyé un mail à la liste de diffusion android-developers à propos d'une erreur sur le document API (concernant la méthode focusSearch() et certains contants de focus).

Voici ma solution à ce problème:

Construire une ressource d'animation pour « grandir » l'image:

<?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 vous ne recevez pas ce que cela signifie alors vous devriez passer à lire this

Ce sera notre effet 'grow', et vous aurez besoin de l'enregistrer dans: res/anim/grow.xml ou quel que soit le nom qu'il vous suites (mais toujours dans res/anim dir).

Vous pouvez suivre le guide de ressources de here pour créer une vue Gallery. Le ImageAdapter génère un ImageView chaque fois que l'objet Gallery appelle getView(). Une solution de contournement, vous pouvez mettre en œuvre est l'ajout d'une ligne à la méthode getView() qui identifie un View avec un position, de cette façon:

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

Avec cette ligne ajoutée à la méthode getView() de l'objet ImageAdpater, vous pouvez identifier sans voir dans un auditeur, par exemple:

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

    } 
    }); 

REMARQUE: Vous remarquerez peut-être que toutes les valeurs de l'animation et de paramètres de mise en page a été choisi par moi à la main. C'est parce que je ne vais pas nettoyer le code pour vous.Et, c'est juste une solution de contournement le problème de focus BAD avec ce widget ou le système de vue android. Si le focus était OK, alors, tout ce que vous devez faire est de définir un écouteur de changement de focus qui fait le gros/rétrécir quand il est focus/flou.

J'espère que cela peut vous aider à trouver un moyen de contourner votre problème,

Cordialement,

Nouveau EDIT: Ceci est l'auditeur que j'ai mis, j'ai aussi ajouté la ligne i.clearAnimation() dans la méthode 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: Le casting à 'ImageView' était en vain .. – Sebastian

+0

génial! Merci! – davs

+0

+1 Vous ne voyez pas cela. Accepté comme réponse. Merci pour votre temps les gars! Très utile. – Legend

4

Vous devez utiliser un ImageSwitcher. L'ImageSwitcher a des méthodes pour définir les animations d'entrée et de sortie (lorsque l'image est sélectionnée et désélectionnée, ou sélectionnée et remplacée).

Le following link a un bon didacticiel sur la façon de l'utiliser conjointement avec la Galerie.

+0

Wow ... C'est un site incroyable ...! Merci beaucoup ... – Legend

+0

Désolé je ne l'ai pas remarqué mais je n'arrivais toujours pas à trouver un moyen d'agrandir et de réduire les images dans le sélecteur d'images ... Ce que je veux dire, c'est la partie supérieure qui est visible ... Quand on clique dessus, ça devrait nous donner une taille normale sinon une taille réduite ... Ai-je manqué une solution triviale? – Legend

2

I mis en œuvre une animation similaire à ceci:

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

    });