Spero che questo sia utile. Riesco a "simulare" la soluzione shrink/grow con il widget Gallery
. Da quando hanno rimosso lo getScale()
, le cose si complicano un po '. Penso che non sia la soluzione migliore, ma almeno posso conviverci.
Quello che ho trovato è che Gallery
gestisce la messa a fuoco ESTREMAMENTE CATTIVO. Quindi, il primo approccio è stato quello di aggiungere un ascoltatore di cambiamento di messa a fuoco sul ImageView
visualizzato, ma senza fortuna lì. Focus è un MESS lì ... in termini, l'immagine selezionata non è la vista attualmente focalizzata. Ho inviato una mail alla mailing list degli sviluppatori android per alcuni errori sul doc dell'API (per quanto riguarda il metodo focusSearch()
e alcuni contesti di attivazione).
Ecco la mia soluzione a questo problema:
Costruire una risorsa di animazione a 'crescere' l'immagine:
<?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"/>
Se non si ottiene che cosa significa allora si dovrebbe procedere alla lettura this
Questo sarà il nostro effetto di "crescita" e sarà necessario salvarlo in: res/anim/grow.xml
o in qualsiasi altro nome (ma sempre nella directory res/anim).
È possibile seguire la guida delle risorse da here per creare una vista Gallery
. Il ImageAdapter
crea un ImageView
ogni volta che l'oggetto Gallery
chiama getView()
. Una soluzione è possibile implementare è aggiunta una riga al metodo getView()
che identifica un View
con position
, in questo modo:
...
i.setId(position);
...
Con tale linea aggiunto al metodo dell'oggetto ImageAdpater
getView()
, si può quindi inequivocabilmente che visualizzare all'interno di un ascoltatore, per esempio:
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: Si può notare che tutti i valori di animazione e da parametri di layout è stato scelto da me a portata di mano. Questo perché non ho intenzione di pulire il codice per te.E, questo è solo un modo per risolvere il problema di attenzione BAD con questo widget o il sistema di visualizzazione di Android. Se la messa a fuoco era OK, quindi, tutto ciò che devi fare è impostare un listener di cambiamento della messa a fuoco che faccia il gros/restringa quando ha il focus/unfocused.
Spero che questo può aiutare a trovare un modo per aggirare per il vostro problema,
saluti,
nuovo EDIT: Questo è l'ascoltatore che ho impostato, ho aggiunto anche la linea i.clearAnimation()
nel metodo 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) {
}
}
Sto facendo la stessa cosa ma non funziona su alcuni dispositivi Android, se hai ottenuto questa animazione in galleria, mandami il codice. – Hasmukh