2013-02-03 4 views
5

Ohne zu sehr ins Detail zu gehen, möchte ich in der Lage sein, Elemente in einem ListView "Slide to Archive" -Feature in GMail zu verschieben. Mir geht es gut mit dem onTouchListener und alles, meine Frage betrifft die Folienanimation.Android - Slide ListView mit setX, setPadding oder Tween-Animation?

Die ersten beiden Dinge, die den Sinn kommen, sind ..

view.setPadding(slideOffset, 0, 0, 0); 

und ..

view.setX(slideOffset); 

Ersteres ist sehr buttrig, sogar auf dem Emulator.
Letzteres ist ein wenig Janky auf meinem Galaxy Nexus.

Meine Fragen:
* Unabhängig davon, was ich versucht habe, was ist der richtige Weg, dies zu tun?
Warum ist setX weniger glatt als setPadding?
Entspricht ein Ansatz den Android-Best Practices mehr als dem anderen?
Sind Tween-Übersetzungs-Animationen eine Option? Wenn ja, können Sie mir ein kurzes Beispiel geben, um mich in die richtige Richtung zu weisen?

Edit:
Um klar zu sein, bin ich ein Bild der Wirkung Anbringen ich nacheifern versuche.

enter image description here

+0

Ich werde das Kopfgeld darauf laufen lassen. Ich bin mir nicht sicher, ob dieses Problem keine gute Antwort hat oder ob ich gerade nicht die richtige Frage stelle. Vielleicht wird sich eine elegante Lösung in der Zeit präsentieren. –

Antwort

1

Ich bin mir ziemlich sicher, dass die setX() ist langsamer, weil es seine Eltern beeinflusst. Wenn Sie das X einer Ansicht ändern, wird jedes Mal, wenn Sie den Wert aktualisieren, onLayout/onMeasure des übergeordneten Elements aufgerufen. Das liegt daran, dass der X-Wert des untergeordneten Elements dazu führen kann, dass andere Elemente auf dem übergeordneten Element verschoben werden. Daher muss sich das übergeordnete Element selbst neu zeichnen.

Sie können dies leicht testen, indem Sie die ViewGroup erweitern und in das Protokoll dieser Methoden schreiben. Dann können Sie beide Ansätze verwenden, Padding vs. SetX, und sehen, was passiert.

Möchten Sie den Artikel animieren? Oder möchten Sie, dass der Nutzer es wie in Gmail bewegt? Sie können den ObjectAnimator verwenden, um den "X" -Wert Ihres Objekts zu behandeln. Kombiniert mit einer "Hardware-Schicht" für Ihren Gegenstand, wird es ein flüssigeres Erlebnis schaffen. Weitere Informationen dazu finden Sie hier: http://developer.android.com/guide/topics/graphics/hardware-accel.html

+0

Das scheint bei den onLayout/onMeasure Calls viel Sinn zu machen. Wäre es möglich, dies zu umgehen, oder wäre das ein Grund, Padding zu verwenden? Oder ist Padding nur ein Hack? Ich würde es bevorzugen, wenn der Gegenstand dem Finger des Benutzers folgt, also ist keine Animation notwendig. Ist ObjectAnimator geeignet, wenn sich der Zielort ständig ändert - etwa wenn einem Touch-Ort gefolgt wird? –

+0

In diesem Fall - Animation ist nicht der richtige Ansatz. Sie können immer noch versuchen, eine "Hardware-Ebene" für das Objekt zu erstellen, die es der GPU beim Zeichnen leichter macht, zu zeichnen. Vergessen Sie nicht, die Ebene zu entfernen, nachdem Sie fertig sind. Sagen Sie uns, wie es ging. – Udinic

1

Ja, wenn Sie auf höhere APIs abzielen, ist ViewPropertyAnimator wahrscheinlich eine großartige Lösung. Wenn Sie niedrigere APIs unterstützen müssen, mein Denkprozess für die Umsetzung wäre (und ich habe das nicht selbst persönlich umgesetzt, aber dies sollte für die Leistung gut sein) zu:

  1. In Ihren Touch-Handler, wenn Sie habe festgestellt, dass der Benutzer "gleitet", die Sichtbarkeit der Ansicht auf INVISIBLE setzen und den Zeichnungscache in einer separaten Bitmap speichern (Bitmap bmp = myView.getDrawingCache();)

    Zeichnen Sie diese Bitmap an der gleichen Stelle Als Ansicht verwenden Sie die Canvas-Methode translate, um die Position entsprechend der x-Position des Berührungspunkts des Benutzers zu verschieben.

  2. Nachdem der Benutzer losgelassen hat, übersetzen Sie zurück (vorzugsweise reibungslos mit einer Animation), recyceln Sie die Bitmap und setzen Sie die Ansicht wieder auf VISIBLE.

+0

Ich habe diesen Kommentar an einige Freunde weitergegeben, einige, die über Android und/oder Programmierung wissen, und einige, die nicht wissen. Alle mein Gefühl geteilt, dass, wenn dies der richtige Weg ist, Dinge wie diese zu tun, sieht es nicht gut für Android. Ist das der richtige Weg, um solche Dinge in Android zu tun? Oder ist das nur ein Hack, um es zu erledigen? Ich bin überrascht, dass dies kein gut dokumentiertes Problem mit einer Lösung ist. –

+0

Viele Dinge in Android fühlen sich wie Hacks. Ich denke, es kann eingekocht werden, in welchem ​​Fall das Beste für dich ist. Wenn Sie sicher sind, dass sich die Reihe nicht ändert, scheint das ein guter Ansatz zu sein. Ansonsten würde ich setPadding() verwenden. –

1