Comment animez-vous le changement de couleur d'arrière-plan d'une vue sur Android?
Par exemple:
J'ai une vue avec une couleur de fond rouge. La couleur d'arrière-plan de la vue devient bleu. Comment puis-je effectuer une transition en douceur entre les couleurs?
Si cela ne peut pas être fait avec des vues, une alternative sera la bienvenue.
Réponses:
J'ai fini par trouver une (assez bonne) solution à ce problème!
Vous pouvez utiliser un TransitionDrawable pour accomplir cela. Par exemple, dans un fichier XML dans le dossier dessinable, vous pouvez écrire quelque chose comme:
Ensuite, dans votre XML pour la vue réelle, vous référenceriez ce TransitionDrawable dans l'
android:background
attribut.À ce stade, vous pouvez lancer la transition dans votre code sur commande en faisant:
Ou exécutez la transition en sens inverse en appelant:
Voir la réponse de Roman pour une autre solution utilisant l'API d'animation de propriété, qui n'était pas disponible au moment où cette réponse a été initialement publiée.
la source
Vous pouvez utiliser une nouvelle API d'animation de propriété pour l'animation des couleurs:
Pour une compatibilité descendante avec Android 2.x, utilisez la bibliothèque Nine Old Androids de Jake Wharton.
La
getColor
méthode a été déconseillée dans Android M, vous avez donc deux choix:Si vous utilisez la bibliothèque de support, vous devez remplacer les
getColor
appels par:si vous n'utilisez pas la bibliothèque de support, vous devez remplacer les
getColor
appels par:la source
ValueAnimator.ofArgb(colorFrom, colorTo)
semble plus pertinent, mais malheureusement, c'est nouveau.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:
argb
valeur dans un fichier xml.view.setBackgroundColor()
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 aColorDrawable
, 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:
Utilisez une transition à dessiner si:
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:
Créez et utilisez un
ObjectAnimator
comme ceci.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:
Définition dessinable:
Créez et utilisez un ValueAnimator comme celui-ci:
Transition drawable :
Définition de la vue:
Définition dessinable:
Utilisez le TransitionDrawable comme ceci:
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.
la source
Vous pouvez créer un animateur d'objets. Par exemple, j'ai un targetView et je veux changer la couleur de votre fond:
la source
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Sa mise en œuvre est justeofInt(...).setEvaluator(new ArgbEvaluator())
.Si vous voulez une animation couleur comme celle-ci,
ce code vous aidera:
la source
anim.setRepeatCount(ValueAnimator.INFINITE);
pas être Animation.INFINITE pour le moment c'est la même chose, mais nous n'avons aucune garantiela meilleure façon est d’utiliser ValueAnimator et
ColorUtils.blendARGB
la source
Un autre moyen simple d'y parvenir consiste à effectuer un fondu à l'aide d'AlphaAnimation.
la source
C'est la méthode que j'utilise dans une activité de base pour changer l'arrière-plan. J'utilise GradientDrawables généré dans le code, mais pourrait être adapté en fonction.
mise à jour: au cas où quelqu'un rencontrerait le même problème que j'ai trouvé, pour une raison quelconque sur Android <4.3, l'utilisation
setCrossFadeEnabled(true)
provoquait un effet de blanc indésirable, j'ai donc dû passer à une couleur unie pour <4.3 en utilisant la méthode @Roman Minenok ValueAnimator susmentionnée.la source
La réponse est donnée de plusieurs façons. Vous pouvez également utiliser
ofArgb(startColor,endColor)
desValueAnimator
.pour API> 21:
la source
La documentation sur les animations propulsées par XML est horrible. J'ai cherché autour des heures juste pour animer la couleur de fond d'un bouton en appuyant sur ... Le plus triste, c'est que l'animation n'est qu'à un attribut: Vous pouvez utiliser
exitFadeDuration
dansselector
:Ensuite, utilisez-le comme
background
pour votre vue. Aucun code Java / Kotlin nécessaire.la source
android:enterFadeDuration
; mon expérience était que, sans elle, mon animation ne fonctionnait pas la deuxième fois.Voici une belle fonction qui permet cela:
Et à Kotlin:
la source
ajoutez un animateur de dossier dans le dossier res . (le nom doit être animateur ). Ajoutez un fichier de ressources d'animation. Par exemple res / animator / fade.xml
À l'intérieur du fichier java Activity, appelez ceci
la source
Utilisez la fonction ci-dessous pour Kotlin:
Passez la vue dont vous souhaitez changer la couleur.
la source
J'ai trouvé que l'implémentation utilisée par
ArgbEvaluator
dans le code source Android fait le meilleur travail dans la transition des couleurs. Lors de l'utilisation de HSV, selon les deux couleurs, la transition sautait à travers trop de teintes pour moi. Mais cette méthode ne fonctionne pas.Si vous essayez d'animer simplement, utilisez
ArgbEvaluator
avecValueAnimator
comme suggéré ici :Cependant, si vous êtes comme moi et que vous souhaitez lier votre transition à un geste de l'utilisateur ou à une autre valeur transmise à partir d'une entrée, cela
ValueAnimator
n'est pas très utile (sauf si vous ciblez l'API 22 et au-dessus, auquel cas vous pouvez utiliser laValueAnimator.setCurrentFraction()
méthode ). Lorsque vous ciblez en dessous de l'API 22, enveloppez le code trouvé dansArgbEvaluator
le code source dans votre propre méthode, comme indiqué ci-dessous:Et utilisez-le comme vous le souhaitez.
la source
Sur la base de la réponse de ademar111190 , j'ai créé cette méthode qui pulsera la couleur d'arrière-plan d'une vue entre deux couleurs quelconques:
la source