Abhängig davon, wie Ihre Ansicht ihre Hintergrundfarbe erhält und wie Sie Ihre Zielfarbe erhalten, gibt es verschiedene Möglichkeiten, dies zu tun.
Die ersten beiden verwenden das Android Property Animation Framework.
Verwenden Sie einen Objektanimator, wenn:
- Die Hintergrundfarbe Ihrer Ansicht ist als
argb
Wert in einer XML-Datei definiert.
- Die Farbe Ihrer Ansicht wurde zuvor von festgelegt
view.setBackgroundColor()
- Die Hintergrundfarbe Ihrer Ansicht ist in einem Zeichen definiert , das KEINE zusätzlichen Eigenschaften wie Striche oder Eckenradien definiert.
- Die Hintergrundfarbe Ihrer Ansicht ist in einer Zeichnungsform definiert. Sie möchten zusätzliche Eigenschaften wie Striche oder Eckenradien entfernen. Beachten Sie, dass das Entfernen der zusätzlichen Eigenschaften nicht animiert wird.
Der Objektanimator ruft auf, view.setBackgroundColor
der das definierte Drawable ersetzt, es sei denn, es handelt sich um eine Instanz von a ColorDrawable
, was selten der Fall ist. Dies bedeutet, dass zusätzliche Hintergrundeigenschaften aus einem Zeichenelement wie Strich oder Ecken entfernt werden.
Verwenden Sie einen Werteanimator, wenn:
- Die Hintergrundfarbe Ihrer Ansicht wird in einem Zeichenbild definiert, das auch Eigenschaften wie den Strich oder den Eckenradius festlegt UND Sie möchten sie in eine neue Farbe ändern, die während der Ausführung festgelegt wird.
Verwenden Sie eine Übergangszeichnung, wenn:
- Ihre Ansicht sollte zwischen zwei Zeichen wechseln, die vor der Bereitstellung definiert wurden.
Ich hatte einige Leistungsprobleme mit Transition-Drawables, die ausgeführt werden, während ich ein DrawerLayout öffne, das ich nicht lösen konnte. Wenn Sie also auf unerwartetes Stottern stoßen, sind Sie möglicherweise auf denselben Fehler gestoßen wie ich.
Sie müssen das Beispiel für den Wertanimator ändern , wenn Sie eine Zeichnungsdatei für StateLists oder eine Zeichnungsliste für LayerLists verwenden möchten. Andernfalls stürzt sie in der final GradientDrawable background = (GradientDrawable) view.getBackground();
Zeile ab.
Objektanimator :
Ansichtsdefinition:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Erstellen und verwenden Sie eine ObjectAnimator
solche.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Sie können die Animationsdefinition auch mit einem AnimatorInflater aus einer XML laden, wie dies XMight in Android objectAnimator tut. Animieren Sie backgroundColor of Layout
Wertanimator :
Ansichtsdefinition:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Zeichnungsfähige Definition:
<?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>
Erstellen und verwenden Sie einen ValueAnimator wie folgt:
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();
Übergang zeichnbar :
Ansichtsdefinition:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Zeichnungsfähige Definition:
<?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>
Verwenden Sie das TransitionDrawable wie folgt:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Sie können die Animationen umkehren, indem Sie die Animationsinstanz aufrufen .reverse()
.
Es gibt einige andere Möglichkeiten, Animationen zu erstellen, aber diese drei sind wahrscheinlich die häufigsten. Ich benutze normalerweise einen ValueAnimator.