Jak animować zmianę koloru tła widoku na Androidzie?
Na przykład:
Mam widok z czerwonym kolorem tła. Kolor tła widoku zmienia się na niebieski. Jak mogę płynnie przechodzić między kolorami?
Jeśli nie można tego zrobić z widokami, alternatywa będzie mile widziana.
android
animation
view
background-color
hpique
źródło
źródło
Odpowiedzi:
W końcu znalazłem (całkiem dobre) rozwiązanie tego problemu!
Aby to zrobić, możesz użyć TransitionDrawable . Na przykład w pliku XML w folderze z możliwością rysowania możesz napisać coś takiego:
Następnie w swoim XML dla rzeczywistego Widoku odwoływałbyś się do TransitionDrawable w
android:background
atrybucie.W tym momencie możesz zainicjować przejście w swoim kodzie na polecenie, wykonując:
Lub uruchom przejście w odwrotną stronę, wywołując:
Zobacz odpowiedź Romana na inne rozwiązanie korzystające z interfejsu API Animacji właściwości, który nie był dostępny w momencie, gdy ta odpowiedź została pierwotnie opublikowana.
źródło
Do animacji kolorów można użyć nowego interfejsu API animacji właściwości :
Aby zachować kompatybilność wsteczną z systemem Android 2.x, użyj biblioteki Nine Old Androidy od Jake Wharton.
getColor
Metoda została zaniechana w Android M, więc masz dwie możliwości:Jeśli korzystasz z biblioteki wsparcia, musisz zastąpić
getColor
połączenia:jeśli nie korzystasz z biblioteki wsparcia, musisz zastąpić
getColor
wywołania:źródło
ValueAnimator.ofArgb(colorFrom, colorTo)
wygląda bardziej na sedno, ale niestety jest nowy.W zależności od tego, w jaki sposób widok ma kolor tła i od tego, w jaki sposób uzyskasz kolor docelowy, możesz to zrobić na kilka różnych sposobów.
Pierwsze dwa wykorzystują system Android Property Animation .
Użyj animatora obiektów, jeśli:
argb
wartość w pliku xml.view.setBackgroundColor()
Animator obiektów działa poprzez wywołanie,
view.setBackgroundColor
które zastępuje zdefiniowane dające się rysować, chyba że jest to instancja aColorDrawable
, którą rzadko jest. Oznacza to, że wszelkie dodatkowe właściwości tła z rysunku, takie jak obrys lub narożniki, zostaną usunięte.Użyj animatora wartości, jeśli:
Użyj rysowanego przejścia, jeśli:
Miałem pewne problemy z wydajnością programów drawable Transition, które działają podczas otwierania DrawerLayout, których nie byłem w stanie rozwiązać, więc jeśli napotkasz jakieś nieoczekiwane jąkanie, możesz napotkać ten sam błąd, co ja.
Będziesz musiał zmodyfikować przykład Value Animator, jeśli chcesz użyć rysowalnej StateLists lub rysowalnej LayerLists , w przeciwnym razie ulegnie awarii na
final GradientDrawable background = (GradientDrawable) view.getBackground();
linii.Animator obiektów :
Zobacz definicję:
Utwórz i użyj
ObjectAnimator
podobnego.Możesz także załadować definicję animacji z pliku XML za pomocą AnimatorInflater, tak jak XMight robi w obiekcie Android Animowane tło animacji Kolor układu
Animator wartości :
Zobacz definicję:
Rysowana definicja:
Utwórz i użyj ValueAnimator w następujący sposób:
Wyciągane przejście :
Zobacz definicję:
Rysowana definicja:
Użyj TransitionDrawable w następujący sposób:
Możesz odwrócić animacje, wywołując
.reverse()
instancję animacji.Istnieje kilka innych sposobów tworzenia animacji, ale te trzy są prawdopodobnie najczęstsze. Ogólnie używam ValueAnimator.
źródło
Możesz zrobić animator obiektu. Na przykład mam obiekt docelowy i chcę zmienić kolor tła:
źródło
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Jego wdrożenie jest sprawiedliweofInt(...).setEvaluator(new ArgbEvaluator())
.Jeśli chcesz taką animację kolorową,
ten kod pomoże ci:
źródło
anim.setRepeatCount(ValueAnimator.INFINITE);
Animation.INFINITE, na razie jest taki sam, ale nie mamy żadnych gwarancjinajlepszym sposobem jest użycie ValueAnimator i
ColorUtils.blendARGB
źródło
Innym łatwym sposobem na osiągnięcie tego jest wykonanie przejścia za pomocą AlphaAnimation.
źródło
Jest to metoda, której używam w działaniu podstawowym do zmiany tła. Używam GradientDrawables wygenerowanych w kodzie, ale można je dostosować do potrzeb.
aktualizacja: na wypadek, gdyby ktoś napotkał ten sam problem, z jakiegoś powodu na Androidzie <4.3 użycie
setCrossFadeEnabled(true)
powoduje niepożądany efekt wygaszenia, więc musiałem przełączyć się na jednolity kolor dla <4.3 za pomocą metody @Roman Minenok ValueAnimator wspomnianej powyżej.źródło
Odpowiedź udzielana jest na wiele sposobów. Można również skorzystać
ofArgb(startColor,endColor)
zValueAnimator
.dla API> 21:
źródło
Dokumentacja animacji opartych na XML jest okropna. Szukałem około godzin, aby animować kolor tła przycisku po naciśnięciu ... Smutne jest to, że animacja jest tylko o jeden atrybut: Możesz użyć
exitFadeDuration
wselector
:Następnie użyj go jak
background
do swojego widoku. Kod Java / Kotlin nie jest potrzebny.źródło
android:enterFadeDuration
; moje doświadczenie było takie, że bez tego moja animacja nie działała po raz drugi.Oto fajna funkcja, która pozwala na to:
A w Kotlinie:
źródło
dodaj animator folderu do folderu res . (nazwa musi być animatorem ). Dodaj plik zasobów animatora. Na przykład res / animator / fade.xml
Wewnątrz pliku Java działania, nazwij to
źródło
Użyj poniższej funkcji dla Kotlin:
Podaj dowolny widok, który chcesz zmienić kolor.
źródło
Przekonałem się, że implementacja zastosowana
ArgbEvaluator
w kodzie źródłowym Androida najlepiej sprawdza się w przenoszeniu kolorów. Podczas korzystania z HSV, w zależności od dwóch kolorów, przejście przeskakiwało dla mnie zbyt wiele odcieni. Ale ta metoda nie.Jeśli próbujesz po prostu animować, użyj zgodnie
ArgbEvaluator
zValueAnimator
sugestią tutaj :Jednak jeśli jesteś podobny do mnie i chcesz powiązać przejście z jakimś gestem użytkownika lub inną wartością przekazaną z danych wejściowych,
ValueAnimator
to nie jest zbyt pomocne (chyba że celujesz w API 22 i wyżej, w którym to przypadku możesz użyćValueAnimator.setCurrentFraction()
metody ). Podczas celowania poniżej API 22, zawiń kod znaleziony wArgbEvaluator
kodzie źródłowym własną metodą, jak pokazano poniżej:I używaj go, jak chcesz.
źródło
Na podstawie odpowiedzi ademar111190 stworzyłem tę metodę, która będzie pulsować kolorem tła widoku między dowolnymi dwoma kolorami:
źródło