A seconda di come la vista ottiene il colore di sfondo e di come si ottiene il colore target, esistono diversi modi per farlo.
I primi due utilizzano il framework di animazione delle proprietà Android .
Utilizzare un animatore di oggetti se:
- La vista ha il colore di sfondo definito come
argb
valore in un file XML.
- In precedenza la tua vista aveva il colore impostato
view.setBackgroundColor()
- La tua vista ha il suo colore di sfondo definito in un disegno che NON definisce alcuna proprietà extra come i raggi di tratto o angolo.
- La vista ha il colore di sfondo definito in un disegno e si desidera rimuovere eventuali proprietà extra come i raggi di tratto o angolo, tenere presente che la rimozione delle proprietà extra non verrà animata.
L'animatore di oggetti funziona chiamando view.setBackgroundColor
sostituendo il disegnabile definito a meno che non sia un'istanza di a ColorDrawable
, cosa che raramente lo è. Ciò significa che verranno rimosse eventuali proprietà di sfondo aggiuntive da un disegno come tratto o angoli.
Utilizzare un animatore valore se:
- La tua vista ha il suo colore di sfondo definito in un disegno che imposta anche proprietà come i raggi del tratto o dell'angolo E vuoi cambiarlo con un nuovo colore che viene deciso durante l'esecuzione.
Usa un disegno Transizione se:
- La vista dovrebbe passare tra due disegni che sono stati definiti prima della distribuzione.
Ho avuto alcuni problemi di prestazioni con i drawable Transition che vengono eseguiti mentre apro un DrawerLayout che non sono stato in grado di risolvere, quindi se si verificano balbuzie impreviste, è possibile che si sia verificato lo stesso errore.
Dovrai modificare l'esempio di Value Animator se vuoi usare un disegnabile StateLists o un LayerList , altrimenti andrà in crash sulla final GradientDrawable background = (GradientDrawable) view.getBackground();
linea.
Animatore oggetti :
Vedi definizione:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Crea e usa un ObjectAnimator
simile.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Puoi anche caricare la definizione di animazione da un xml usando un AnimatorInflater come XMight fa nell'oggetto Android Animator animare lo sfondo Colore del layout
Value Animator :
Vedi definizione:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definizione estraibile:
<?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>
Crea e usa un ValueAnimator in questo modo:
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();
Disegnabile di transizione :
Vedi definizione:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Definizione estraibile:
<?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>
Usa TransitionDrawable in questo modo:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Puoi invertire le animazioni chiamando .reverse()
l'istanza dell'animazione.
Esistono altri modi per realizzare animazioni, ma questi tre sono probabilmente i più comuni. In genere utilizzo un ValueAnimator.