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