Je nachdem, wie Ihre Ansicht ihre Hintergrundfarbe erhält und wie Sie Ihre Zielfarbe erhalten, gibt es verschiedene Möglichkeiten, dies zu tun.
Bei den ersten beiden wird die Android-Eigenschaftsanimation Rahmen.
Verwenden Sie eine Objekt-Animator wenn:
- Ihre Ansicht hat eine Hintergrundfarbe, die als
argb
Wert in einer xml-Datei.
- Die Farbe Ihrer Ansicht wurde zuvor durch
view.setBackgroundColor()
- Ihre Ansicht hat ihre Hintergrundfarbe in einer Zeichenfläche definiert, die NICHT definiert alle zusätzlichen Eigenschaften wie Striche oder Eckradien.
- Wenn die Hintergrundfarbe Ihrer Ansicht in einer Zeichenfläche definiert ist und Sie zusätzliche Eigenschaften wie Striche oder Eckradien entfernen möchten, beachten Sie, dass die Entfernung der zusätzlichen Eigenschaften nicht animiert wird.
Der Objektanimator funktioniert durch den Aufruf von view.setBackgroundColor
die die definierte Zeichenfläche ersetzt, es sei denn, sie ist eine Instanz einer ColorDrawable
was selten der Fall ist. Das bedeutet, dass alle zusätzlichen Hintergrundeigenschaften einer Zeichenfläche wie Striche oder Ecken entfernt werden.
Verwenden Sie eine Wert Animator wenn:
- Ihre Ansicht hat ihre Hintergrundfarbe in einem Drawable definiert, das auch Eigenschaften wie die Kontur oder die Eckradien festlegt, und Sie möchten sie in eine neue Farbe ändern, die während der Ausführung festgelegt wird.
Verwenden Sie eine Übergang zeichenbar wenn:
- Ihre Ansicht sollte zwischen zwei Drawables wechseln, die vor der Bereitstellung definiert wurden.
Ich hatte einige Performance-Probleme mit Transition Drawables, die ausgeführt werden, während ich ein DrawerLayout öffne, die ich nicht lösen konnte. Wenn Sie also auf unerwartetes Stottern stoßen, könnten Sie auf denselben Fehler gestoßen sein wie ich.
Sie müssen das Value Animator-Beispiel ändern, wenn Sie eine StateLists zeichenbar oder eine LayerLists zeichenbar sonst stürzt es bei der final GradientDrawable background = (GradientDrawable) view.getBackground();
Linie.
Objekt-Animator :
Definition anzeigen:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Erstellen und Verwenden einer ObjectAnimator
wie diese.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Sie können die Animationsdefinition auch aus einer Xml-Datei laden, indem Sie einen AnimatorInflater verwenden, wie es XMight in Android objectAnimator animate backgroundColor von Layout
Wert Animator :
Definition anzeigen:
<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 diesen:
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 zeichenbar :
Definition anzeigen:
<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 .reverse()
auf die Animationsinstanz.
Es gibt noch einige andere Möglichkeiten, Animationen zu erstellen, aber diese drei sind wahrscheinlich die häufigsten. Ich verwende in der Regel einen ValueAnimator.