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!

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 ...


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


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.


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;
}

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,


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;
   }

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);
}

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;
    }

0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));

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


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);
}

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;
    }

0

Em Kotlin:

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

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);

o que é esse ColorGenerator? De onde você tirou isso?
orelzion
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.