Android: gerar cores aleatórias com um clique?

95

Eu tenho um ImageView, no qual estou criando drawables de maneira programática e os apresentando ao usuário. Meu objetivo é clicar em dito ImageViewe mudar a cor do drawable.

Como eu faria sobre a mudança de cor aleatória? Atualmente, estou a mexer com Random(), Color.argb()e algumas outras coisas, mas eu não consigo fazê-lo funcionar!

Jared
fonte

Respostas:

329
Random rnd = new Random();
paint.setARGB(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));

ou

Random rnd = new Random(); 
int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));   
view.setBackgroundColor(color);

Embora, no seu caso, pareça que você deseja criar um novo drawable e atribuí-lo à sua visualização. Qual é realmente o drawable no seu caso? É uma imagem, forma, preenchimento ...

Lumis
fonte
15
Não deveria ser 256 em vez de 255 em todos os lugares? A API para nextInt () diz "Retorna um int pseudo-aleatório uniformemente distribuído no intervalo semiaberto [0, n)"
Catalin Morosan
1
Kaciula, você está certo e n foi excluído: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis
cor int = 0xFF000000 | rnd.nextInt (0xFFFFFF); "use apenas 1 aleatório em vez de 3"
Umesh Chhabra
A função Color.argb requer API pelo menos 26 para funcionar.
Isso é Enam
@ That'sEnam não, há duas funções Color.argb, uma leva argumentos int e existe desde o nível 1 da API, aquela de que você está falando leva argumentos flutuantes e sim, é apenas a partir da API 26
Shane Monks O'Byrne
16

para obter valores de cor aleatórios, você pode usar este método:

public int getRandomColor(){
   Random rnd = new Random();
   return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}

em seguida, aplique às suas opiniões:

myView.setBackgroundColor(getRandomColor());

insira a descrição da imagem aqui

Jorgesys
fonte
13

Portanto, se você está procurando uma paleta de cores bonita, talvez não seja uma boa ideia usar valores totalmente aleatórios. Esta abordagem pode não produzir os melhores resultados. Sempre termina com uma seleção de cores semelhantes muito escuras ou muito claras.

Abordagem semi-aleatória:

Se você precisar de algumas cores frescas e brilhantes, use a seguinte classe simples, que escrevi anteriormente quando tive os mesmos problemas. É semi-randome usa uma paleta de cores predefinida:

class RandomColors {
    private Stack<Integer> recycle, colors;

    public RandomColors() {
        colors = new Stack<>();
        recycle =new Stack<>();
        recycle.addAll(Arrays.asList(
                0xfff44336,0xffe91e63,0xff9c27b0,0xff673ab7,
                0xff3f51b5,0xff2196f3,0xff03a9f4,0xff00bcd4,
                0xff009688,0xff4caf50,0xff8bc34a,0xffcddc39,
                0xffffeb3b,0xffffc107,0xffff9800,0xffff5722,
                0xff795548,0xff9e9e9e,0xff607d8b,0xff333333
                )
        );
    }

    public int getColor() {
        if (colors.size()==0) {
            while(!recycle.isEmpty())
                colors.push(recycle.pop());
            Collections.shuffle(colors);
        }
        Integer c= colors.pop();
        recycle.push(c);
        return c;
    }
}

Classe Random Color Generator para Android


Abordagem aleatória:

Mas se você ainda está pensando em usar, random approachvocê pode querer usar esta única linha em vez de várias linhas de código:

int color= ((int)(Math.random()*16777215)) | (0xFF << 24);

Random Color Generator android

O objetivo de usar isso (0xFF << 24)é definir o valor alfa para o máximo que significa transparência zero.

ucMedia
fonte
1
O seu é o melhor para um caso de design controlado ;-)
nemesisfixx
5

Eu conheci isso e este é o meu código, pode ajudar

 /**
 * view-source:http://www.kareno.org/js/colors/ 参考
 *Get Random background color and the text color for the background
 * @return 0--》background
 *          1--》text color
 */
public static  int[] getRandomColor() {
    Random random = new Random();
    int RGB = 0xff + 1;
    int[] colors = new int[2];
    int a = 256;
    int r1 = (int) Math.floor(Math.random() * RGB);
    int r2 = (int) Math.floor(Math.random() * RGB);
    int r3 = (int) Math.floor(Math.random() * RGB);
    colors[0] = Color.rgb(r1, r2, r3);
    if((r1 + r2 + r3) > 450) {
        colors[1] = Color.parseColor("#222222");
    }else{
        colors[1] = Color.parseColor("#ffffff");
    }
    return colors;
}
acntwww
fonte
e onde está o método rgb?
Rachit Mishra
@twntee rgb é um método estático, consulte: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww
sim entendeu! na verdade, houve várias importações no meu arquivo com o nome de salvamento?
Rachit Mishra,
5
thing.setBackgroundColor(new Random().nextInt());
Gary Davies
fonte
1

Este é o meu código que usei em um aplicativo, pode ajudar.

Ele gera uma cor aleatória ao toque

 public boolean onTouch(View v, MotionEvent event) {
            int x = (int)event.getX();
            int y = (int) event.getY();
            float w = v.getWidth();

            if(x < (w * (1.0/3) )){
                layout.setBackgroundColor(Color.rgb(255,x,y));
            }else if(x < (w * (2.0 / 3))){
                layout.setBackgroundColor(Color.rgb(x,255,y));
            }else{
                layout.setBackgroundColor(Color.rgb(x,y,255));
            }
            return true;
   }
Sumit
fonte
o que exatamente isto faz? Parece que foi feito para levar em consideração a posição do toque
Kartik Chugh
ele mudará o plano de fundo da visualização ao tocar, quando você tocar e mover, ele gerará uma cor aleatória de acordo com a posição xy e se aplicará à visualização
Sumit
1
 public static int randomColor(){
    float[] TEMP_HSL = new float[]{0, 0, 0};
    float[] hsl = TEMP_HSL;
    hsl[0] = (float) (Math.random() * 360);
    hsl[1] = (float) (40 + (Math.random() * 60));
    hsl[2] = (float) (40 + (Math.random() * 60));
    return ColorUtils.HSLToColor(hsl);
}
Raghav Thakkar
fonte
Este código gera Blue várias vezes, não é aleatório
Hitesh Sahu
1

Você pode usar ColorGenerator para escolher a cor aleatória

ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT

int color1 = generator.getRandomColor();      // generate random color

Se você deseja ter o mesmo código de cor específico para os mesmos nomes de usuário repetidos. você pode usar como abaixo

public int getColorCode(String userName)
    {
        ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT
        // generate color based on a key (same key returns the same color), useful for list/grid views
        int colorCode = generator.getColor(userName);

        return colorCode;
    }
Rei das missas
fonte
0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));
Mukesh Patil
fonte
0

Solução mais precisa para este problema:

-Primeiro, adicione isso no gradle (app),

compile 'com.github.lzyzsd.randomcolor:library:1.0.0'

em seguida, compile e reconstrua o aplicativo.

- A segunda etapa é apenas usá-lo desta forma,

RandomColor randomColor = new RandomColor();

Button l = findviewbyid(R.id.B1);
l.setBackgroundColor(randomColor.randomColor());

Link de referência:

https://github.com/lzyzsd/AndroidRandomColor

Sohaib Aslam
fonte
0

No seu caso, você deve fazer como aqui, é um trabalho para mim

@Override
public void onBindViewHolder(@NonNull WeatherMainAdapter.ViewHolder holder, int position) {
    Random rnd = new Random();
    int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    holder.date.setText(items.get(position).getDt_txt());
    holder.temp.setText(items.get(position).main.getTemp());
    holder.press.setText(items.get(position).main.getPressure());
    holder.cardView.setBackgroundColor(color);
}
Максим Сыроватка
fonte
0
public static String rndColor()
    {
        Random random = new Random();
        int num = random.nextInt(16777215);
        String hex = "";
        while (num != 0)
        {
            if (num % 16 < 10)
                hex = Integer.toString(num % 16) + hex;
            else
                hex = (char)((num % 16)+55) + hex;
            num = num / 16;
        }

        return "#"+((hex.length()<6)?String.format("%0"+(6-hex.length())+"d", 0):"") + hex;
    }
Kamran
fonte
0

Em Kotlin:

val rnd = Random()
val color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
myView.setBackgroundColor(color)
paul_f
fonte
0

Espero que as duas soluções a seguir possam ajudá-lo.

Existem duas maneiras de obter cores aleatórias programaticamente para definir como view

1. Primeira solução

public int randomColor()
       {
         Random random= new Random();
         return Color.argb(255, random.nextInt(256), random.nextInt(256), 
         random.nextInt(256));
       }

Se você estiver usando em um adapterpergaminho, pode obter cores aleatórias para o mesmo, viewisso pode não parecer bom, para evitar isso, você pode usar a segunda solução.

2.Segunda Solução

Você pode usar em ColorGenerator.DEFAULTvez de ColorGenerator.MATERIALconforme sua escolha. Você também pode usar qualquer em numbervez deposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);
Sagar
fonte
o que é esse ColorGenerator? De onde você tirou isso?
orelzion