Android: Animation dans la Galerie View?
-
21-09-2019 - |
Question
Lorsque j'utilise le widget Gallery , comment puis-je obtenir les images pour dire intensifier lueur être sélectionné et réduite un lueur être désélectionné ?
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 de animation que je dois joindre à la Galerie ?
La solution
Espérons que cela est utile. Je parviens à « simuler » la solution rétrécir / grandir avec le widget Gallery
. Comme ils ont enlevé le getScale()
, les choses deviennent un peu compliqué. Je pense que ce n'est pas la meilleure solution à tout, mais au moins je peux vivre avec.
Ce que j'ai trouvé que Gallery
gère le focus BAD EXTRÊMEMENT. Ainsi, la première approche a consisté à ajouter un changement de mise au point d'écoute sur le ImageView
affiché, mais pas de chance là-bas. Focus est une MESS là ... en des termes qui, l'image sélectionnée n'est pas la vue actuellement concentré. Je vous ai envoyé un mail à android-mailing list des développeurs à propos une erreur sur l'API doc (en ce qui concerne la focusSearch()
method et quelques Constantes de mise au point).
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 cette
Ce sera notre effet « grandir », 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 / dir anim)
Vous pouvez suivre le guide des ressources de ici pour créer une vue Gallery
. Le ImageAdapter
construit 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 alors identifier clairement ce point de vue au sein d'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");
}
});
NOTE: Vous pouvez remarquer que toutes les valeurs de l'animation et de paramètres de mise en page a été choisi par moi à la main. Ceci est parce que je ne vais pas le code propre pour vous. Et, c'est juste une solution de la question de mise au point BAD avec ce widget ou le système d'affichage Android. Si l'accent était OK, alors, tout ce que vous devez faire est de définir un changement de mise au point d'écoute qui fait les gros / rétrécissent quand il se concentrer / non focalisée.
J'espère que cela peut vous aider à trouver un moyen de contourner votre problème,
Cordialement,
Nouvelle 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) {
}
}
Autres conseils
Vous devez utiliser un ImageSwitcher. Le ImageSwitcher a des méthodes pour fixer la dans et hors des animations (lorsque l'image est sélectionné et désélectionnés, ou choisi et remplacé).
Le lien suivant a un bon tutoriel sur la façon de l'utiliser conjointement avec la Galerie.
Je 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) {}
});