Wie animiert man Layout-Eigenschaften von ViewGroups?

8

Ich habe folgendes Layout:

%Vor%

Ich lande mit so etwas:

%Vor%

Wenn ein bestimmter Toggle aktiviert ist, möchte ich Left animieren, sodass seine Breite den gesamten Bildschirm ausfüllt. Gleichzeitig möchte ich die Breite von Right so animieren, dass sie auf Null schrumpft. Später, wenn der Schalter wieder umgeschaltet wird, muss ich die Dinge in den obigen Zustand zurückversetzen.

Ich habe versucht, meine eigene Animation zu schreiben, die View.getWidth() aufruft, aber wenn ich wieder auf diesen Wert animiere (indem ich View.getLayoutParams().width setze), ist es breiter als zu Beginn. Ich vermute, ich mache es nur falsch. Ich habe auch die gesamte Dokumentation über die Honeycomb-Animation gelesen, aber ich möchte nicht übersetzen oder skalieren ... Ich möchte die Layoutbreiten-Eigenschaft animieren. Ich kann kein Beispiel dafür finden.

Was ist der richtige Weg, dies zu tun?

    
i_am_jorf 22.09.2011, 18:14
quelle

3 Antworten

12

Da dir noch niemand geholfen hat und meine erste Antwort so durcheinander war, werde ich versuchen, dir diesmal die richtige Antwort zu geben; -)

Eigentlich mag ich die Idee, und ich denke, das ist ein großartiger visueller Effekt, der für eine Menge Leute nützlich sein könnte. Ich würde einen Überlauf der rechten Ansicht implementieren (ich denke, dass der Schrumpf seltsam aussieht, da der Text nach unten expandiert).

Aber wie auch immer, hier ist der Code, der perfekt funktioniert (Sie können sogar während der Animation wechseln).

Schnelle Erklärung :
Sie rufen toggle mit einem booleschen Wert für Ihre Richtung auf und dies startet eine Aufrufschleife für die Animationsanimation. Dies erhöht oder verringert die Gewichte beider Ansichten basierend auf der Richtung und der vergangenen Zeit (für eine reibungslose Berechnung und Animation). Die Animationsaufrufschleife wird sich selbst aufrufen, solange sie nicht die Start- oder Endposition erreicht hat.

Das Layout:

%Vor%

Die Aktivität:

%Vor%     
Knickedi 23.09.2011, 17:36
quelle
2

Hier nur meine 2 Cent zu Knickedis ausgezeichneter Antwort hinzufügen - nur für den Fall, dass jemand es braucht:

Wenn Sie mit Gewichten animieren, werden Sie Probleme mit Clipping / Non-Clipping in enthaltenen Ansichten und Viewgroups bekommen. Dies gilt insbesondere, wenn Sie Viewgroups mit Gewicht als Fragmentcontainer verwenden. Um dies zu umgehen, müssen Sie möglicherweise die Ränder der problematischen untergeordneten Ansichten und Viewgroups / Fragmentcontainer animieren.

Und um all diese Dinge zusammen zu tun, ist es immer besser, für ObjectAnimator und AnimatorSet zu gehen (wenn Sie sie verwenden können), zusammen mit einigen Hilfsklassen wie MarginProxy

    
Machine 02.06.2014 11:20
quelle
1

Ein anderer Weg zur Lösung von @knickedi ist die Verwendung von ObjectAnimator anstelle von Runnable. Die Idee ist, ObjectAnimator zu verwenden, um das Gewicht der linken und rechten Ansichten anzupassen. Die Ansichten müssen jedoch angepasst werden, damit das Gewicht als Eigenschaft für die Animation des ObjectAnimator verfügbar gemacht werden kann.

Definieren Sie zuerst eine angepasste Ansicht (mit einem LineareLayout als Beispiel):

%Vor%

Aktualisieren Sie dann das Layout-XML, um dieses benutzerdefinierte lineare Layout zu verwenden.

Wenn Sie die Animation umschalten müssen, verwenden Sie ObjectAnimator:

%Vor%

Der obige Code geht davon aus, dass beide Ansichten ein lineares Layout haben und halb so groß sind, um damit zu beginnen. Die Animation erweitert die rechte Ansicht auf das volle Gewicht (also ist die linke Seite ausgeblendet). Beachten Sie, dass ObjectAnimator mit der Eigenschaft "MyWeight" des angepassten linearen Layouts animiert wird. Das AnimatorSet wird verwendet, um sowohl den linken als auch den rechten ObjectAnimator miteinander zu verknüpfen, so dass die Animation glatt aussieht.

Dieser Ansatz reduziert die Notwendigkeit, runnbaren Code und die darin enthaltene Gewichtungsberechnung zu schreiben, aber es muss eine benutzerdefinierte Klasse definiert werden.

    
henry000 23.11.2015 08:25
quelle