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:
- Twój widok ma zdefiniowany kolor tła jako
argb
wartość w pliku xml.
- Twój widok wcześniej miał ustawiony kolor
view.setBackgroundColor()
- Twój widok ma zdefiniowany kolor tła na rysunku, który NIE definiuje żadnych dodatkowych właściwości, takich jak promień obrysu lub narożnika.
- Twój widok ma zdefiniowany kolor tła w rysunku i chcesz usunąć wszelkie dodatkowe właściwości, takie jak promienie obrysu lub narożnika, pamiętaj, że usunięcie dodatkowych właściwości nie będzie animowane.
Animator obiektów działa poprzez wywołanie, view.setBackgroundColor
które zastępuje zdefiniowane dające się rysować, chyba że jest to instancja a ColorDrawable
, 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:
- Twój widok ma zdefiniowany kolor tła na rysunku, który również ustawia właściwości takie jak promień obrysu lub narożnika ORAZ chcesz zmienić go na nowy kolor, który zostanie określony podczas pracy.
Użyj rysowanego przejścia, jeśli:
- Twój widok powinien przełączać się między dwiema wersjami, które zostały zdefiniowane przed wdrożeniem.
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ę:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Utwórz i użyj ObjectAnimator
podobnego.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
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ę:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Rysowana definicja:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF"/>
<stroke
android:color="#edf0f6"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
Utwórz i użyj ValueAnimator w następujący sposób:
final ValueAnimator valueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
final GradientDrawable background = (GradientDrawable) view.getBackground();
currentAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animator) {
background.setColor((Integer) animator.getAnimatedValue());
}
});
currentAnimation.setDuration(300);
currentAnimation.start();
Wyciągane przejście :
Zobacz definicję:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Rysowana definicja:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#FFFFFF"/>
<stroke
android:color="#edf0f6"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
</item>
<item>
<shape>
<solid android:color="#78c5f9"/>
<stroke
android:color="#68aff4"
android:width="1dp"/>
<corners android:radius="3dp"/>
</shape>
</item>
</transition>
Użyj TransitionDrawable w następujący sposób:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
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.