Selon la façon dont votre vue obtient sa couleur d'arrière-plan et la façon dont vous obtenez votre couleur cible, il existe plusieurs façons de procéder.
Les deux premiers utilisent le framework Android Property Animation .
Utilisez un Animateur d'objets si:
- Votre vue a sa couleur d'arrière-plan définie comme une
argb
valeur dans un fichier xml.
- Votre couleur a déjà été définie par
view.setBackgroundColor()
- Votre vue a sa couleur d'arrière-plan définie dans un dessinable qui NE définit PAS de propriétés supplémentaires comme les rayons de contour ou d'angle.
- Votre vue a sa couleur d'arrière-plan définie dans un dessin et vous souhaitez supprimer toutes les propriétés supplémentaires comme les rayons de contour ou d'angle, gardez à l'esprit que la suppression des propriétés supplémentaires ne sera pas animée.
L'animateur d'objet fonctionne en appelant view.setBackgroundColor
ce qui remplace le dessinable défini, sauf s'il s'agit d'une instance de a ColorDrawable
, ce qui est rarement le cas. Cela signifie que toutes les propriétés d'arrière-plan supplémentaires d'un trait comme les traits ou les coins peuvent être supprimées.
Utilisez un animateur de valeur si:
- Votre vue a sa couleur d'arrière-plan définie dans un dessin qui définit également des propriétés telles que le rayon de contour ou de coin ET vous souhaitez la changer en une nouvelle couleur qui est décidée lors de l'exécution.
Utilisez une transition à dessiner si:
- Votre vue doit basculer entre deux dessinables qui ont été définis avant le déploiement.
J'ai eu des problèmes de performances avec les drawables Transition qui s'exécutent pendant que j'ouvre un DrawerLayout que je n'ai pas pu résoudre, donc si vous rencontrez un bégaiement inattendu, vous pourriez avoir rencontré le même bogue que moi.
Vous devrez modifier l'exemple Value Animator si vous souhaitez utiliser un dessin StateLists ou un LayerLists , sinon il se plantera sur la final GradientDrawable background = (GradientDrawable) view.getBackground();
ligne.
Animateur d'objets :
Définition de la vue:
<View
android:background="#FFFF0000"
android:layout_width="50dp"
android:layout_height="50dp"/>
Créez et utilisez un ObjectAnimator
comme ceci.
final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
"backgroundColor",
new ArgbEvaluator(),
0xFFFFFFFF,
0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();
Vous pouvez également charger la définition d'animation à partir d'un fichier XML à l'aide d'un AnimatorInflater comme XMight le fait dans un objet AndroidAnimator animate backgroundColor of Layout
Animateur de valeur :
Définition de la vue:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Définition dessinable:
<?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>
Créez et utilisez un ValueAnimator comme celui-ci:
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();
Transition drawable :
Définition de la vue:
<View
android:background="@drawable/example"
android:layout_width="50dp"
android:layout_height="50dp"/>
Définition dessinable:
<?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>
Utilisez le TransitionDrawable comme ceci:
final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);
Vous pouvez inverser les animations en appelant .reverse()
l'instance d'animation.
Il existe d'autres façons de faire des animations, mais ces trois sont probablement les plus courantes. J'utilise généralement un ValueAnimator.