Ich erstelle eine App mit einer Galerie, die ein paar Bilder zeigt. Wenn ich durch die Bilder scrolle, bewegen sie sich und springen an einem bestimmten Punkt. Wie kann ich sie sanfter machen? Ein Beispielcode wäre sehr hilfreich.
Antworten
Zu viele Anzeigen?Ich hatte ein ähnliches Problem. Es sieht so aus, als ob es durch Änderungen im Layout verursacht werden kann, z.B. wenn Sie den Text in einem TextView ändern, der eine wrap_content-Breite hat. In diesem Fall ändert sich das Layout und zwingt die Galerie vermutlich dazu, sich selbst zu aktualisieren und sie springt direkt zum aktuellen Element.
Ich konnte es beheben, indem ich mit dem Layout gespielt habe, feste Größen gesetzt habe, wo ich konnte usw., aber ich kenne keine dauerhafte und zuverlässige Lösung.
EDIT: Ich habe auch diesen Hack gefunden, falls das oben Genannte nicht für Sie funktioniert
http://www.unwesen.de/2011/04/17/android-zitternde-scrolling-galerie/
Ich konnte dieses Problem lösen, indem ich die Methode onLayout() in der Elternklasse Gallery überschrieben und dann alle Aufrufe ignoriert habe, bei denen die geänderte Flagge nicht true war.
public class MyGallery extends Gallery {
public MyGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {
super.onLayout(changed, l, t, r, b);
}
}
}
Ich fand die obige Galerie-Erweiterungslösung ziemlich gut funktioniert. Allerdings verursachte sie immer noch etwas Ruckeln. Indem ich einfach die onLayout-Methode überschrieben habe und nach der Anzahl der Ansichten auf dem Bildschirm gesucht habe, habe ich eine "glatt wie Seide" Galerieansicht erhalten. Beachten Sie, dass ich dies für einen Vollbild-Diashow-Effekt verwende.
public class SmoothGallery extends Gallery {
public SmoothGallery(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int viewsOnScreen = getLastVisiblePosition() - getFirstVisiblePosition();
if(viewsOnScreen <= 0)
super.onLayout(changed, l, t, r, b);
}
}