Escurecer uma cor em JAVA (android) RESOLVIDO

Olá gostaria de saber como faço para fazer uma cor escura a partir de outra cor mais clara. resumidamente tenho um app que conta com categorias, cada categoria tem sua própria cor, a minha ideia é que a interface seja da cor da categoria que mais for usada pelo usuário, o problema é que no android, nós temos três cores principais na interface: colorPrimary, colorPrimaryDark, e colorAccent e eu preciso mexer nas duas primeiras. A cor da categoria que mais for usada sera setada como colorPrimary que sera vista em maioria na interface, eu preciso usar essa cor para fazer outra um pouco mais escura para setar na colorPrimaryDark, essa cor é usada na barra de status do aparelho e deve ser alguns tons mais escura que a colorPrimary é ai que eu me complico pois n sei manipular cores.Então o que eu preciso é programar meu app pra criar uma cor com base em outra? alguém sabe como? Obg.

Não lembro como funciona as cores no Android, mas a manipulação de cores no Java (com java.awt.Color) é bem tranquila. Você pode separar a cor nos canais RGB (três inteiros) e modificar como precisar (para escurecer, o meio mais simples é ir subtraindo até chegar perto de zero).

Se você tiver a opção de usar cores personalizadas (ao invés de padões como colorPrimary, colorPrimaryDark e etc), acho que seria interessante criar suas próprias cores para usar em todo o app, podendo ser inclusive cores estáticas (da mesma forma que Color.WHITE e Color.REd, por exemplo).

Abraço.

Obg por responder. Deixa eu ver se torno as coisa mais claras… o app tem 92 cores em uma paleta que pré definida, quando o usuario cria uma nova categoria ele pode atribuir uma dessas cores a ela. A minha ideia é pegar a cor da categoria que ele mais usa e usar na interface, isso é muito simples, o problema é que eu devo usar uma cor um pouco mais escura na barra de status EX: se a categoria mais usada pelo usuario tem a cor lilás eu teria que pegar esse lilás e escurecer ele alguns tons pra usar na barra de status. Você tem algum exemplo de como eu posso fazer isso? achei interessante a ideia separar o cor em RGB para escurece-la. Você poderia escrever um trecho de codigo ou indicar algum tutorial? Obg.

As cores em RGB são compostas de três valores. Se você separá-los, pode aplicar algoritmos e obter novas cores. Por exemplo:

Color color = Color.YELLOW; // uma cor qualquer, não se foque no fato de ser amarelo
int redvalue = amarelo.getRed(); // pega o componente vermelho da cor (entre 0 e 255);
int greenvalue = amarelo.getGreen(); // pega o componente verde da cor (entre 0 e 255);
int bluevalue = amarelo.getBlue(); // pega o componente azul da cor (entre 0 e 255);

// como quero escurecer, preciso subtrair. Mas não posso ir abaixo de zero, então uso max:

int newred = Math.max(redvalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser
int newgreen = Math.max(greenvalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser
int newblue = Math.max(bluevalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser

// crio uma nova cor e posso fazer o que quiser com ela:
Color novacor = new Color(newred, newgreen, newblue);

O RGB é aditivo. Quanto maior o número, mai claro o componente (branco é {255, 255, 255}, preto é {0, 0, 0} ). então, para escurecer, subtrai-se valores.

A classe Color também tem os métodos brighter e darker(), que clareiam ou escurecem uma determinada cor. Não sei que algoritmo é aplicado, mas você pode testar e ver se te agrada (é mais simples que meu código).

Color pinkcolor = Color.PINK;
Color darkerpink = pinkcolor.darker();

Abraço.

1 curtida

Era tudo que eu precisava mas infelizmente estou tendo erros usando import java.awt.Color; e java.awt.Color amarelo = new java.awt.Color(); pelo que eu vi em pesquisas n é possivel usar esse pacote e suas classes no android porque ele contem codigo nativo. Alguma alternativa? Obg pela força.

No Android, a classe é android.graphics.Color (o que faz sentido, já que não existe awt no Android). Um pouquinho de Google só :wink:

Mas não tem os métodos darker() e brighter() , então você terá criar o algoritmo pra isso (como citei acima).

Abraço.

SS dps de responder aqui fiz umas buscas e encontrei a documentaçao em https://developer.android.com/reference/android/graphics/Color.html
o android studio tinha usado esse import (android.graphics.Color) o problema é que alguns aspectos do algoritimo que vc escreveu n funcionam exatamente da mesma forma. Sege o codigo reformulado para android:

  int colorPrimary = 0, colorPrimaryDark = 0;

    int redvalue = Color.red(colorPrimary); // pega o componente vermelho da cor (entre 0 e 255);
    int greenvalue = Color.green(colorPrimary); // pega o componente verde da cor (entre 0 e 255);
    int bluevalue = Color.blue(colorPrimary); // pega o componente azul da cor (entre 0 e 255);

// como quero escurecer, preciso subtrair. Mas não posso ir abaixo de zero, então uso max:

    int newred = Math.max(redvalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser
    int newgreen = Math.max(greenvalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser
    int newblue = Math.max(bluevalue - 50, 0); // 50 é um valor arbitrário, pode ser o que você quiser

// crio uma nova cor e posso fazer o que quiser com ela:
    colorPrimaryDark = android.graphics.Color.rgb(newred, newgreen, newblue);

Muito obrigado pela ajuda vc me poupou muito tempo e esforço!