Estou trabalhando em um aplicativo Android e tenho um drawable que estou carregando de uma imagem de origem. Nesta imagem, gostaria de converter todos os pixels brancos em uma cor diferente, digamos azul, e depois armazenar em cache o objeto Drawable resultante para que eu possa usá-lo mais tarde.
Por exemplo, digamos que eu tenha um arquivo PNG de 20x20 que tenha um círculo branco no meio e que tudo fora do círculo seja transparente. Qual é a melhor maneira de transformar esse círculo branco em azul e armazenar em cache os resultados? A resposta muda se eu quiser usar essa imagem de origem para criar vários novos Drawables (por exemplo, azul, vermelho, verde, laranja etc.)?
Acho que vou querer usar um ColorMatrix de alguma forma, mas não sei como.
fonte
/sillyandroid/src/main/java/me/angrybyte/sillyandroid/extras/Coloring.java
Respostas:
Eu acho que você pode realmente apenas usar
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
. Isso definiria pixels brancos para vermelho, mas não acho que afetaria os pixels transparentes.Consulte Drawable # setColorFilter
fonte
Drawable.mutate().setColorFilter( 0xffff0000, Mode.MULTIPLY)
mais informações: curious-creature.org/2009/05/02/drawable-mutationssetColorFilter
sempre que usamos os ícones em vez de ter seletores com tonalidades de cores diferentes. Ainda assim, é uma solução muito melhor do que editar pngs diretamente e ter recursos estáticos extras.SRC_IN
:myImage.getDrawable().mutate().setColorFilter(getResources().getColor(R.color.icon_grey), PorterDuff.Mode.SRC_IN);
Experimente este código:
fonte
Eu sei que esta pergunta foi feita antes do Lollipop, mas gostaria de adicionar uma boa maneira de fazer isso no Android 5. +. Você cria um desenho xml que faz referência ao original e o define como:
fonte
O novo suporte v4 traz o tom de volta à API 4.
você pode fazer assim
fonte
Se você tem um desenho que é uma cor sólida e deseja alterá-lo para uma cor sólida diferente, você pode usar a
ColorMatrixColorFilter
. A transparência é preservada.fonte
int iColor = ContextCompat.getColor(context, R.color.primary);
.Também uso
ImageView
para ícones (naListView
tela ou configurações). Mas acho que há uma maneira muito mais simples de fazer isso.Use
tint
para alterar a sobreposição de cores no ícone selecionado.Em xml,
funciona bem, uma vez que vem
AppCompat
fonte
Você deve fazer isso para todas as APIs:
fonte
ColorFilter filter = new LightingColorFilter(Color.BLACK, Color.LTGRAY);
mudará de preto para cinza no drawable.Consegui fazer isso com o código a seguir, retirado de uma atividade (o layout é muito simples, contendo apenas um ImageView e não é publicado aqui).
fonte
Você pode resolvê-lo usando as bibliotecas compatíveis do Android. :)
fonte
mutate()
chamada é necessária para poder alterar a tonalidade de um drawable, sem alterar todos os drawables associados a esse ID de recurso.Na sua Atividade, você pode colorir os recursos da imagem PNG com uma única cor:
Agora, quando você usa o R.drawable. *, Ele deve ser colorido com a tonalidade desejada. Se você precisar de cores adicionais, poderá ativar () a gaveta.
fonte
Obrigado a @sabadow
fonte
Se você tiver seu drawable definido para o ImageView, poderá fazê-lo com um liner 1:
fonte
Confira este código de exemplo " ColorMatrixSample.java "
A API relevante está disponível aqui :
fonte
Isso funciona com tudo com background:
Visualização de texto, botão ...
fonte
Este trecho de código funcionou para mim:
fonte
Existem tantas soluções, mas ninguém sugeriu que, se o arquivo xml do recurso de cores já tiver cores, podemos escolher diretamente a partir daí também como abaixo:
fonte
Exemplo curto para alterar a cor desenhável de acordo com
isWorking
campo.Minha forma xml:
Meu método para mudar:
Exemplo de uso:
fonte
em XML /res/values/color.xml
Código Java
fonte
Tarde demais, mas no caso de alguém precisar:
fonte
Funciona para alguns drawables simples. Usei-o em uma forma simples de cor sólida com cantos arredondados e precisava mudar essa cor com diferentes layouts.
Tente isto
fonte
É muito, muito simples, quando você usa uma biblioteca para fazer isso por você. Tente isto biblioteca
Você pode ligar assim:
fonte