Como você anima a mudança da cor de fundo de uma exibição no Android?
Por exemplo:
Eu tenho uma visão com uma cor de fundo vermelho. A cor de fundo da vista muda para azul. Como posso fazer uma transição suave entre cores?
Se isso não puder ser feito com visualizações, uma alternativa será bem-vinda.
android
animation
view
background-color
hpique
fonte
fonte
Respostas:
Acabei descobrindo uma solução (muito boa) para esse problema!
Você pode usar um TransitionDrawable para fazer isso. Por exemplo, em um arquivo XML na pasta drawable, você pode escrever algo como:
Em seguida, em seu XML para a visualização real, você referenciaria esse TransitionDrawable no
android:background
atributoNesse ponto, você pode iniciar a transição no seu código sob comando, fazendo:
Ou execute a transição ao contrário, chamando:
Consulte a resposta de Roman para outra solução usando a API de animação de propriedades, que não estava disponível no momento em que esta resposta foi postada originalmente.
fonte
Você pode usar a nova API de animação da propriedade para animação em cores:
Para compatibilidade com versões anteriores do Android 2.x, use a biblioteca Nine Old Androids da Jake Wharton.
O
getColor
método foi descontinuado no Android M, então você tem duas opções:Se você usar a biblioteca de suporte, precisará substituir as
getColor
chamadas por:se você não usar a biblioteca de suporte, precisará substituir as
getColor
chamadas por:fonte
ValueAnimator.ofArgb(colorFrom, colorTo)
parece mais direto ao ponto, mas infelizmente é novo.Dependendo de como sua exibição obtém a cor de fundo e de como você obtém a cor de destino, existem várias maneiras diferentes de fazer isso.
Os dois primeiros usam a estrutura Android Property Animation .
Use um Animador de Objetos se:
argb
valor em um arquivo xml.view.setBackgroundColor()
O animador de objeto trabalha chamando
view.setBackgroundColor
que substitui o drawable definido, a menos que seja uma instância de aColorDrawable
, o que raramente é. Isso significa que quaisquer propriedades extras de fundo de um drawable, como traços ou cantos, serão removidas.Use um Value Animator se:
Use um drawable Transition se:
Eu tive alguns problemas de desempenho com os drawables Transition que são executados enquanto eu abro um DrawerLayout que não consegui resolver, portanto, se você encontrar alguma gagueira inesperada, poderá ter o mesmo bug que eu.
Você precisará modificar o exemplo do Value Animator se desejar usar um drawable StateLists ou um drawable LayerLists , caso contrário, ele travará na
final GradientDrawable background = (GradientDrawable) view.getBackground();
linha.Animador de Objetos :
Ver definição:
Crie e use um
ObjectAnimator
como este.Você também pode carregar a definição de animação de um xml usando um AnimatorInflater como o XMight faz no objeto Android.
Value Animator :
Ver definição:
Definição Drawable:
Crie e use um ValueAnimator como este:
Drawable de transição :
Ver definição:
Definição Drawable:
Use o TransitionDrawable assim:
Você pode reverter as animações chamando
.reverse()
a instância de animação.Existem outras maneiras de fazer animações, mas essas três são provavelmente as mais comuns. Eu geralmente uso um ValueAnimator.
fonte
Você pode criar um animador de objeto. Por exemplo, eu tenho um targetView e quero alterar sua cor de plano de fundo:
fonte
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Sua implementação é justaofInt(...).setEvaluator(new ArgbEvaluator())
.Se você quiser animação em cores como esta,
este código o ajudará:
fonte
anim.setRepeatCount(ValueAnimator.INFINITE);
Animation.INFINITE, por enquanto, é o mesmo, mas não temos garantiasA melhor maneira é usar o ValueAnimator e
ColorUtils.blendARGB
fonte
Outra maneira fácil de conseguir isso é fazer um desbotamento usando o AlphaAnimation.
fonte
Este é o método que eu uso em uma Atividade base para mudar o plano de fundo. Estou usando o GradientDrawables gerado no código, mas pode ser adaptado para se adequar.
update: Caso alguém encontre o mesmo problema que eu encontrei, por alguma razão no Android <4.3, o uso
setCrossFadeEnabled(true)
causa um efeito indesejável de apagamento, então tive que mudar para uma cor sólida para <4.3 usando o método @Roman Minenok ValueAnimator mencionado acima.fonte
A resposta é dada de várias maneiras. Você também pode usar
ofArgb(startColor,endColor)
deValueAnimator
.para API> 21:
fonte
Aqui está uma boa função que permite isso:
E em Kotlin:
fonte
A documentação sobre animações XML é horrível. Pesquisei por horas apenas para animar a cor de fundo de um botão ao pressionar ... O triste é que a animação está a apenas um atributo de distância: Você pode usar
exitFadeDuration
oselector
:Em seguida, use-o como
background
na sua visão. Não é necessário código Java / Kotlin.fonte
android:enterFadeDuration
; minha experiência foi que, sem ela, minha animação não funcionou na segunda vez.adicione um animador de pasta na pasta res . (o nome deve ser animador ). Adicione um arquivo de recurso do animador. Por exemplo, res / animator / fade.xml
Dentro do arquivo java Activity, chame isso
fonte
Use a função abaixo para Kotlin:
Passe na visualização que você deseja alterar a cor.
fonte
Eu descobri que a implementação usada por
ArgbEvaluator
no código-fonte do Android funciona melhor na transição de cores. Ao usar o HSV, dependendo das duas cores, a transição estava passando por muitos tons para mim. Mas esse método não.Se você está tentando simplesmente animado, o uso
ArgbEvaluator
comValueAnimator
como sugerido aqui :No entanto, se você é como eu e deseja vincular sua transição a algum gesto do usuário ou outro valor passado de uma entrada, isso
ValueAnimator
não ajuda muito (a menos que você esteja direcionando para a API 22 e superior, nesse caso, você pode usar oValueAnimator.setCurrentFraction()
método ) Ao segmentar abaixo da API 22, agrupe o código encontrado noArgbEvaluator
código-fonte em seu próprio método, conforme mostrado abaixo:E use-o como quiser.
fonte
Com base na resposta de ademar111190 , eu criei esse método que pulsará a cor de fundo de uma exibição entre duas cores:
fonte