Jak animować widok w systemie Android i utrzymywać go w nowej pozycji / rozmiarze?

81

Obecnie mam widok w mojej aplikacji na Androida, a widok odtwarza animację klatki. Chcę animować widok, aby zwiększyć jego rozmiar do 150%. Kiedy zastosuję do niego animację skali i animacja skali zostanie zakończona, chcę, aby widz pozostał w tym nowym rozmiarze do końca cyklu życia działania. Niestety teraz, gdy animacja skalowania w górę jest zakończona, widok wraca do pierwotnego rozmiaru. Jak mogę to zrobić, aby zachować nową animowaną transformację?

używam

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

Dzięki!

justinl
źródło

Odpowiedzi:

150

Upewnij się, że dodajesz poniższe atrybuty do elementu głównego w pliku XML animacji:

android:fillAfter="true" 
android:fillEnabled="true"
Qlimax
źródło
7
To jest prawdziwa odpowiedź. PO powinien zmienić tę odpowiedź, aby była akceptowaną odpowiedzią. Dziękuję Qlimax !! (PS nie jest to udokumentowane w sekcji „Animacja” w Przewodniku dla programistów, jest to udokumentowane tylko w javadocach dla klasy Animation. Taka kiepska dokumentacja!)
Neil Traft
7
gdzie umieścić ten kod? w <set ...></set>czy w tagach animacji ( translate| rotate| scale)?
xxxxxxxxxadfas
5
jak wspomniano poniżej, musisz dodać go do ustawionego parametru
cV2
3
To nie działa. Chcę, aby rzeczywisty rozmiar widoku zmieniał się wraz z animacją. Zmienia tylko treść. Zmieniam skalę Y z 1,0 na 0,0 i animacja się dzieje, ale pozostawia puste miejsce w miejscu, w którym był widok. Próbowałem również View.GONE, ale to przyciąga inne widoki do pustej przestrzeni. Potrzebuję innych widoków, aby podążały za rozmiarem widoku skalowania podczas jego zmniejszania. Jak to działa?
Sudhanshu
1
Każdy, kto to czyta, powinien zauważyć, że fillAftertylko zatrzyma piksele widoku, podczas gdy rzeczywisty widok będzie nadal w pozycji początkowej. Musisz ręcznie ustawić LayoutParamsswój widok prawdopodobnie w onAminationEnd (listener).
Muhammad Babar
52

spróbuj skonstruować animację z kodu i ustawić właściwości w ten sposób

anim.setFillEnabled(true);
anim.setFillAfter(true);
Mina Samy
źródło
ale tworzy nowy problem, otrzymuję na nim zdarzenie dotykowe. stackoverflow.com/questions/4728908/…
W00di
32

jeśli chcesz umieścić swoją animację w formacie XML , może to pomóc:

<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

proszę również docenić drugą odpowiedź, pomogli mi :) powodzenia!

cV2
źródło
22

W dzisiejszych czasach stało się to bardzo łatwe:

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

(W tym fragmencie użyto ViewPropertyAnimator).

Istnieje również możliwość dołączenia wielu innych opcji.

Widok zostanie umieszczony w nowej pozycji.

Andrzej
źródło
Powinno to zostać opublikowane jako
zyskujący
2

EDYCJA: odpowiedź Qlimax jest lepsza, ale ponieważ OP nie wrócił, aby zmienić znacznik wyboru i nie mogę usunąć zaakceptowanej odpowiedzi, skopiuję ją tutaj: po prostu ustaw fillAfter = true fillEnabled = true

Moja pierwotna odpowiedź (która działa, ale w porównaniu jest nieco śmieszna) jest następująca:

Aby wszystko działało zgodnie z oczekiwaniami po animacji, przynajmniej zgodnie z tym wątkiem , będziesz musiał napisać onAnimationEndprocedurę obsługi i tam ręcznie dostosować "rzeczywiste" (przed transformacją) granice widoku, aby pasowały do ​​końcowego wyniku animacja skali.

Walter Mundt
źródło
Cześć Walter. Zastąpiłem onAnimationEnd, ale nie wiem, jak dostosować „rzeczywiste” granice widoku, aby pasowały do ​​skali animacji. Wiem, jakim dokładnym dp ma się skończyć, ale nie mogę znaleźć funkcji „setWidth ()” lub „setHeight ()”.
justinl
1
Uważam, że są one przechowywane w LayoutParams. Powinieneś być w stanie to zrobić view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();. (To drugie wezwanie jest konieczne, aby poinformować drzewo widoków, że należy je ponownie obliczyć.)
Walter Mundt
2
To niezwykle okrężny sposób robienia rzeczy. Wszystko, co trzeba zrobić, to ustawić atrybuty android:fillEnabledi android:fillAfteroba muszą być prawdziwe.
Neil Traft
1

Właściwie, ponieważ animacja, której używasz, wydaje się być osadzona w strukturze Androida, nie jestem pewien, czy możesz w niej cokolwiek zmienić.
Możesz jednak utworzyć własną animację, postępując zgodnie z przykładem w dokumentacji . Będziesz musiał dodać android: fillAfter = "true", jeśli chcesz, aby skalowanie zostało zachowane po zakończeniu animacji.

Sephy
źródło
2
scaleUp150 to niestandardowa animacja, którą napisałem w xml (choć jest bardzo prosta). Umieściłem android: fillAfter = "true" w animacji, ale nadal wraca do oryginalnego rozmiaru: S
justinl.
1

Umieść android: fillAfter = "true" w tagu SET - ponieważ umieszczenie ich w tagu animacji ogranicza je do "parametrów przejścia" lub "podczas / podczas animowania parametrów". Parametry w zestawie SET zastosują transformację, której szukasz, po zakończeniu animacji.

takrishna
źródło