Você pode ter usado o ID do recurso inteiro em vez de valor de cor inteiro, tentar converter R.color.blue para getResources () GetColor (R.color.blue).
milosmns
Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (contexto, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (desenhável); // qualquer cor pode ser usada aqui
flame3
Respostas:
916
Você pode alterar a tonalidade facilmente no código via:
ATUALIZAÇÃO : O
@ADev possui uma solução mais nova em sua resposta aqui , mas sua solução requer uma biblioteca de suporte mais recente - 25.4.0 ou superior.
Deve ser a resposta aceita. Observe que ele funciona apenas em ImageViewinstâncias xml com o tema AppCompat ou em AppCompatImageViewsubclasses.
Louis CAD
11
O @ADev aprecia sua solução, mas a pergunta foi feita em 2013 e o ImageViewCompat e o AppCompatImageView lançam com suporte à v4 lib 25.4.0 em junho de 2017 e 25.1.0 de dezembro de 2016, respectivamente :)
Hardik
11
@ADev, é claro, mas você não mencionou corretamente em sua resposta que sua solução é nova e requer uma biblioteca de suporte 25.4.0 e superior, porque com a versão inferior do suporte lib, essa classe não está disponível para que ninguém possa encontrá-la! !! a propósito, eu editei a resposta :) bom dia ... #
sim, funcionou para mim também, sem o segundo parâmetro .. Pode também vaimImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
votado e sem o segundo parâmetro, ele funciona como charme. Thx @ toobsco42
Ravi Vaniya
35
@Hardik está certo. O outro erro no seu código ocorre quando você faz referência à cor definida pelo XML. Você passou apenas o ID para o setColorFiltermétodo, quando deveria usá-lo para localizar o recurso de cores e passar o recurso para o métodosetColorFilter método. Reescrevendo seu código original abaixo.
Caso contrário, você precisa fazer referência à sua atividade principal:
Activity main =...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Observe que isso também se aplica a outros tipos de recursos, como números inteiros, bools, dimensões, etc. Exceto pela string, para a qual você pode usar diretamente getString()em sua Atividade sem a necessidade de ligar primeiro.getResources() (não me pergunte por que) .
Caso contrário, seu código ficará bem. (Embora eu não tenha investigado setColorFiltermuito o método ...)
Eu também tive que fazer imageView.getBackground()para obter o drawable, porque imageView.getDrawable()estava retornando nulo.
Rock Lee
@RockLee ter certeza de que você usou src em vista imagem xml ou setImageResource em código
orelzion
esta é a maneira perfeita de cor da tonalidade conjunto para o fundo ImageView
leegor
12
Melhor função de extensão simplificada graças ao ADev
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
Existe um similar para a tonalidade do texto do Button / TextView?
desenvolvedor android
você quer dizer a cor ou matiz do texto do textview?
Manohar Reddy
Quero dizer "tonalidade de texto". A cor do texto. Mas acho que é bastante problemático, pois o texto tem uma cor para cada estado ... Por outro lado, como funciona bem quando eu defino a cor de destaque ... Estranho ... É possível, talvez, definir a cor de destaque para um botão específico (ou TextView), programaticamente?
desenvolvedor android
11
Se sua cor tiver transparência hexadecimal, use o código abaixo.
//get ImageViewImageView myImageView =(ImageView) findViewById(R.id.iv);//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));
Isso parece funcionar apenas na API 21+, mas para mim isso não foi um problema. Você pode usar um ImageViewCompat para resolver esse problema.
A partir do Lollipop, existe um método chamado ImageView#setImageTintList()que você pode usar ... a vantagem é que ele leva um ColorStateListoposto a apenas uma única cor, tornando a tonalidade da imagem sensível ao estado.
Nos dispositivos pré-pirulito, você pode obter o mesmo comportamento pintando o drawable e, em seguida, definindo-o como o ImageViewdrawable da imagem:
Somando-se ADEV 's resposta (que na minha opinião é o mais correto), desde a adopção generalizada de Kotlin, e as suas funções de extensão úteis:
fun ImageView.setTint(context:Context,@ColorRes colorId:Int){
val color =ContextCompat.getColor(context, colorId)
val colorStateList =ColorStateList.valueOf(color)ImageViewCompat.setImageTintList(this, colorStateList)}
Eu acho que essa é uma função que pode ser útil em qualquer projeto do Android!
Oi, ele não está funcionando para desenhos vetoriais .. Alguma solução para o mesmo?
precisa saber é o seguinte
@Manukumar Use em app:srcCompatvez de android:srce adicione vectorDrawables.useSupportLibrary = truena defaultConfigparte do seu arquivo build.gradle. Testado para funcionar bem no emulador Kitkat.
desenvolvedor android
3
Não use PoterDuff.Mode, use setColorFilter()funciona para todos.
Estou atrasado na festa, mas não vi minha solidão acima. Também podemos definir a cor da tonalidade setImageResource()(meu minSdkVersion é 24).
Então, primeiro, você precisa criar um seletor e salvá-lo na /drawablepasta de ativos (eu chamo de ic_color_white_green_search.xml)
<!-- Focused and not pressed --><itemandroid:state_focused="true"android:state_pressed="false"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Focused and pressed --><itemandroid:state_focused="true"android:state_pressed="true"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Default --><itemandroid:drawable="@drawable/ic_search"/>
Em seguida, defina-o em código como este:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Solução Kotlin usando a função de extensão, para definir e desabilitar a coloração:
fun ImageView.setTint(@ColorInt color:Int?){if(color ==null){ImageViewCompat.setImageTintList(this,null)return}ImageViewCompat.setImageTintMode(this,PorterDuff.Mode.SRC_ATOP)ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(color))}
isso é sobre tonalidade! não alfa que é para transparência.
David
Mas isso acaba agindo como uma tonalidade. Você deve tentar você mesmo. Esta é apenas uma maneira de ver as coisas.
Shubham Chaudhary
@ShubhamChaudhary Eu sei que isso é tarde, mas e se a imagem for png. Então o fundo não mudará? Alfa e matiz também são muito diferentes. Matiz É como substituição de cor, se não estiver errado. Nenhuma ofensa pretendida. Apenas tentando ajudar :)
KISHORE_ZE
Ponto válido. Esta resposta ajudou no meu caso. A esperança também se encaixa nos sapatos de outra pessoa.
Respostas:
Você pode alterar a tonalidade facilmente no código via:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Matiz brancoSe você quiser tonalidade de cor,
Para vetor Drawable
ATUALIZAÇÃO : O
@ADev possui uma solução mais nova em sua resposta aqui , mas sua solução requer uma biblioteca de suporte mais recente - 25.4.0 ou superior.
fonte
android:tint
funciona em todas as versões do Android. Talvez você esteja falandodrawableTint
?A maioria das respostas se refere ao uso
setColorFilter
que não é o que foi originalmente solicitado.O usuário @Tad tem sua resposta na direção certa, mas funciona apenas na API 21+.
Para definir a tonalidade em todas as versões do Android, use o
ImageViewCompat
:Observe que
yourTint
, nesse caso, deve ser uma "cor int". Se você possui um recurso de coresR.color.blue
, precisa primeiro carregar a cor int:fonte
ImageView
instâncias xml com o tema AppCompat ou emAppCompatImageView
subclasses.Isso funcionou para mim
fonte
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik está certo. O outro erro no seu código ocorre quando você faz referência à cor definida pelo XML. Você passou apenas o ID para o
setColorFilter
método, quando deveria usá-lo para localizar o recurso de cores e passar o recurso para o métodosetColorFilter
método. Reescrevendo seu código original abaixo.Se esta linha estiver dentro da sua atividade:
Caso contrário, você precisa fazer referência à sua atividade principal:
Observe que isso também se aplica a outros tipos de recursos, como números inteiros, bools, dimensões, etc. Exceto pela string, para a qual você pode usar diretamente
getString()
em sua Atividade sem a necessidade de ligar primeiro.getResources()
(não me pergunte por que) .Caso contrário, seu código ficará bem. (Embora eu não tenha investigado
setColorFilter
muito o método ...)fonte
Depois que eu tentei todos os métodos e eles não funcionaram para mim.
Eu recebo a solução usando outro PortDuff.MODE.
fonte
A partir do Lollipop, também existe um método de tonalidade para o BitmapDrawables que funciona com a nova classe Palette:
e
Nas versões mais antigas do Android, agora você pode usar a biblioteca DrawableCompat
fonte
Tente isso. Ele deve funcionar em todas as versões do Android suportadas pela biblioteca de suporte:
Você pode usar qualquer um dos itens acima para fazê-lo funcionar.
Você pode ler sobre os recursos mais interessantes do DrawableCompat nos documentos, aqui .
fonte
imageView.getBackground()
para obter o drawable, porqueimageView.getDrawable()
estava retornando nulo.Melhor função de extensão simplificada graças ao ADev
Uso:-
fonte
Se sua cor tiver transparência hexadecimal, use o código abaixo.
Para limpar a tonalidade
fonte
img
é do tipo ImageView.Simples e uma linha
fonte
Como a primeira resposta não funcionou para mim:
Isso parece funcionar apenas na API 21+, mas para mim isso não foi um problema. Você pode usar um ImageViewCompat para resolver esse problema.
Espero ter ajudado alguém :-)
fonte
A partir do Lollipop, existe um método chamado
ImageView#setImageTintList()
que você pode usar ... a vantagem é que ele leva umColorStateList
oposto a apenas uma única cor, tornando a tonalidade da imagem sensível ao estado.Nos dispositivos pré-pirulito, você pode obter o mesmo comportamento pintando o drawable e, em seguida, definindo-o como o
ImageView
drawable da imagem:fonte
fonte
Para definir tonalidade para uma imagem vista programaticamente no android
Eu tenho dois métodos para o Android:
1)
2)
Espero ter ajudado alguém :-)
fonte
Somando-se ADEV 's resposta (que na minha opinião é o mais correto), desde a adopção generalizada de Kotlin, e as suas funções de extensão úteis:
Eu acho que essa é uma função que pode ser útil em qualquer projeto do Android!
fonte
Descobri que podemos usar o seletor de cores para o atributo tint:
activity_main.xml:
section_arrowup_color.xml:
fonte
app:srcCompat
vez deandroid:src
e adicionevectorDrawables.useSupportLibrary = true
nadefaultConfig
parte do seu arquivo build.gradle. Testado para funcionar bem no emulador Kitkat.Não use
PoterDuff.Mode
, usesetColorFilter()
funciona para todos.fonte
Como @milosmns disse, você deve usar
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Essa API precisa de um valor de cor em vez do ID do recurso de cores. Essa é a causa principal da razão pela qual sua declaração não funcionou.
fonte
Estou atrasado na festa, mas não vi minha solidão acima. Também podemos definir a cor da tonalidade
setImageResource()
(meu minSdkVersion é 24).Então, primeiro, você precisa criar um seletor e salvá-lo na
/drawable
pasta de ativos (eu chamo deic_color_white_green_search.xml
)Em seguida, defina-o em código como este:
fonte
Caso você queira definir o seletor para a sua tonalidade:
fonte
Solução Kotlin usando a função de extensão, para definir e desabilitar a coloração:
fonte
Resposta não exata, mas uma alternativa mais simples:
Aqui está um trecho para isso:
fonte
png
. Então o fundo não mudará? Alfa e matiz também são muito diferentes. Matiz É como substituição de cor, se não estiver errado. Nenhuma ofensa pretendida. Apenas tentando ajudar :)