Wie animiere ich eine Ansicht in Android und lasse sie an der neuen Position / Größe bleiben?

80

Ich habe derzeit eine Ansicht in meiner Android-App und die Ansicht spielt eine Rahmenanimation ab. Ich möchte die Ansicht animieren, um sie auf 150% zu vergrößern. Wenn ich eine Skalierungsanimation darauf anwende und die Skalierungsanimation abgeschlossen ist, möchte ich, dass der Betrachter für den Rest des Lebenszyklus der Aktivität auf dieser neuen Größe bleibt. Leider wird die Ansicht gerade nach Abschluss der Scale-up-Animation auf die ursprüngliche Größe zurückgesetzt. Wie kann ich es schaffen, die neue animierte Transformation beizubehalten?

Ich benutze

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

Vielen Dank!

justinl
quelle

Antworten:

149

Stellen Sie sicher, dass Sie dem Stammelement in Ihrer Animations-XML die folgenden Attribute hinzufügen :

android:fillAfter="true" 
android:fillEnabled="true"
Qlimax
quelle
7
Das ist die wahre Antwort. Das OP sollte dies ändern, um die akzeptierte Antwort zu sein. Vielen Dank, Qlimax! (PS: Dies ist nicht im Abschnitt "Animation" des Dev Guide dokumentiert, sondern nur in den Javadocs für die Animationsklasse. Solch schlechte Dokumentation!)
Neil Traft
7
Wo soll dieser Code abgelegt werden? in <set ...></set>oder in Animations-Tags ( translate| rotate| scale)?
xxxxxxxxxadfas
5
Wie unten erwähnt, müssen Sie es dem eingestellten Parameter hinzufügen
cV2
3
Das funktioniert nicht. Ich möchte, dass sich die tatsächliche Größe der Ansicht mit der Animation ändert. Es ändert nur den Inhalt. Ich ändere die Skala Y von 1,0 auf 0,0 und die Animation wird ausgeführt, lässt jedoch einen leeren Bereich, in dem sich die Ansicht befand. Ich habe auch View.GONE ausprobiert, aber das schnappt die anderen Ansichten in den leeren Raum. Ich benötige die anderen Ansichten, um der Größe der Skalierungsansicht zu folgen, während sie verkleinert wird. Wie bringt man das zum Laufen?
Sudhanshu
1
Jeder andere, der dies liest, fillAfterwird darauf hingewiesen, dass nur die Ansichtspixel erhalten bleiben, während sich die tatsächliche Ansicht noch in der Ausgangsposition befindet. Sie müssen LayoutParamsIhre Ansicht wahrscheinlich manuell in onAminationEnd (Listener) festlegen.
Muhammad Babar
52

Versuchen Sie, die Animation aus Code zu erstellen und die Eigenschaften wie folgt festzulegen

anim.setFillEnabled(true);
anim.setFillAfter(true);
Mina Samy
quelle
aber ist neues problem erstellen, ich erhalte berührungsereignis darauf. stackoverflow.com/questions/4728908/…
W00di
31

Wenn Sie Ihre Animation in eine XML-Datei einfügen möchten , ist dies möglicherweise erforderlich, um Folgendes zu unterstützen:

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

bitte schätze auch die andere antwort, hat mir geholfen :) viel glück!

cV2
quelle
22

Heutzutage ist es sehr einfach geworden:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(In diesem Snippet wurde ViewPropertyAnimator verwendet).

Es ist auch möglich, mehrere andere Optionen anzuhängen.

Die Ansicht befindet sich an der neuen Position.

Andrey
quelle
Dies sollte als
Trendthema veröffentlicht werden
2

BEARBEITEN: Die Antwort von Qlimax ist besser, aber da das OP nicht zurückgekehrt ist, um das Häkchen zu ändern, und ich eine akzeptierte Antwort nicht löschen kann, kopiere ich sie hier: Setzen Sie einfach fillAfter = true fillEnabled = true

Meine ursprüngliche Antwort (die funktioniert, aber im Vergleich leicht lächerlich ist) lautet wie folgt:

Damit die Dinge nach der Animation wie erwartet funktionieren , müssen Sie zumindest gemäß diesem Thread einen onAnimationEndHandler schreiben und dort die "echten" (Vor-Transformations-) Grenzen Ihrer Ansicht manuell anpassen, um sie an das Endergebnis von anzupassen die Skalenanimation.

Walter Mundt
quelle
Hallo Walter. Ich habe das onAnimationEnd überschrieben, weiß aber nicht, wie ich die "echten" Grenzen der Ansicht an den Maßstab der Animation anpassen soll. Ich weiß, wie genau dp es enden soll, aber ich kann die Funktion "setWidth ()" oder "setHeight ()" nicht finden.
Justin
1
Ich glaube, diese sind in den LayoutParams gespeichert. Sie sollten in der Lage sein zu tun view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (Letzterer Aufruf ist erforderlich, um den Ansichtsbaum darüber zu informieren, dass er neu berechnet werden muss.)
Walter Mundt
2
Dies ist ein unglaublich umständlicher Weg, Dinge zu tun. Alles was man tun muss, ist Attribute zu setzen android:fillEnabledund android:fillAfterbeides wahr zu sein.
Neil Traft
1

Da die von Ihnen verwendete Animation in das Android-Framework eingebettet zu sein scheint, bin ich mir nicht sicher, ob Sie daran etwas ändern können.
Sie können jedoch eine eigene Animation erstellen, indem Sie dem Beispiel in der Dokumentation folgen . Und Sie müssen android: fillAfter = "true" setzen, wenn die Skalierung nach dem Ende der Animation beibehalten werden soll.

Sephy
quelle
2
scaleUp150 ist eine benutzerdefinierte Animation, die ich in XML geschrieben habe (obwohl sie extrem einfach ist). Ich habe das Android: fillAfter = "true" in die Animation eingefügt, aber es schnappt immer noch auf die ursprüngliche Größe zurück: S
justinl
1

Fügen Sie android: fillAfter = "true" in das SET-Tag ein - da das Einfügen in das Animationstag sie auf die "Übergangsparameter" oder "während / während der Animationsparameter" beschränkt. Die Parameter im SET wenden die gesuchte Transformation an, nachdem die Animationen abgeschlossen sind.

Takrishna
quelle