Android: ¿Generar color aleatorio al hacer clic?

95

Tengo un ImageView, en el que estoy creando dibujables programáticamente y presentándolos al usuario. Mi objetivo es hacer clic en dicho ImageViewy cambiar el color del dibujo.

¿Cómo haría con el cambio de color aleatorio? Actualmente estoy jugando con Random(), Color.argb()y algunas otras cosas, pero me parece que no puede conseguir que funcione!

Jared
fuente

Respuestas:

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

o

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

Aunque en su caso parece que desea crear un nuevo dibujable y asignarlo a su vista. ¿Cuál es realmente el dibujable en tu caso? ¿Es una imagen, forma, relleno ...

Lumis
fuente
15
¿No debería ser 256 en lugar de 255 en todas partes? La API para nextInt () dice "Devuelve un int distribuido uniformemente pseudoaleatorio en el rango medio abierto [0, n)"
Catalin Morosan
1
Kaciula, tienes razón, la n está excluida: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis
int color = 0xFF000000 | rnd.nextInt (0xFFFFFF); "use solo 1 aleatorio en lugar de 3"
Umesh Chhabra
La función Color.argb requiere API al menos 26 para funcionar.
Eso es Enam
@ Eso esEnam no, hay dos funciones Color.argb, una toma argumentos int y ha existido desde el nivel 1 de API, la de la que estás hablando toma argumentos flotantes y sí, es solo desde API 26
Shane Monks O'Byrne
16

para obtener valores de color aleatorios, puede utilizar este método:

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

luego aplique a sus puntos de vista:

myView.setBackgroundColor(getRandomColor());

ingrese la descripción de la imagen aquí

Jorgesys
fuente
13

Entonces, si está buscando una hermosa paleta de colores, tal vez no sea una gran idea usar valores totalmente aleatorios. Es posible que este enfoque no produzca los mejores resultados. Siempre termina con una selección de colores similares demasiado oscuros o demasiado brillantes.

Enfoque semialeatorio:

Si necesita colores frescos y brillantes, use la siguiente clase simple, que escribí anteriormente cuando tuve los mismos problemas. Es semi-randomy utiliza una paleta de colores 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;
    }
}

Clase de generador de color aleatorio para Android


Enfoque aleatorio:

Pero si todavía está considerando su uso, random approaches posible que desee usar esta única línea en lugar de varias líneas de código:

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

Generador de color aleatorio android

El propósito de usar esto (0xFF << 24)es establecer el valor alfa al máximo, lo que significa transparencia cero.

ucMedia
fuente
1
El suyo es el mejor para un caso de diseño controlado ;-)
nemesisfixx
5

Conocí esto y este es mi código, que me ayude

 /**
 * 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
fuente
y donde esta el metodo rgb?
Rachit Mishra
@twntee rgb es un método estático; consulte: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww
¡Sí, lo tienes! ¿En realidad hubo varias importaciones en mi archivo con el nombre de guardado?
Rachit Mishra
5
thing.setBackgroundColor(new Random().nextInt());
Gary Davies
fuente
1

Este es mi código que utilicé en una aplicación, puede ayudarte.

Genera un color aleatorio al tacto.

 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
fuente
¿Qué hace esto exactamente? Parece que está destinado a tener en cuenta la posición del toque
Kartik Chugh
cambiará el fondo de la vista al tocar, cuando toques y muevas, generará un color aleatorio según la posición xy y se aplicará a la vista
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
fuente
Este código genera azul varias veces, no es aleatorio
Hitesh Sahu
1

Puede usar ColorGenerator para elegir el color aleatorio

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

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

Si desea tener el mismo código de color específico para los mismos nombres de usuario repetidos. puedes usar como a continuación

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;
    }
Rey de misas
fuente
0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));
Mukesh Patil
fuente
0

Solución más precisa de este problema:

-Primero, agregue esto en el gradle (aplicación),

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

luego compile y reconstruya la aplicación.

-El segundo paso solo úsalo de esta manera,

RandomColor randomColor = new RandomColor();

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

Link de referencia:

https://github.com/lzyzsd/AndroidRandomColor

Sohaib Aslam
fuente
0

En tu caso deberías hacer como aquí, para mí es un trabajo

@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);
}
Максим Сыроватка
fuente
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
fuente
0

En Kotlin:

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

Espero que las siguientes dos soluciones puedan ayudarlo.

Hay dos formas de obtener colores aleatorios mediante programación para configurarlos view

1.Primera solución

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

Si está usando in adapteron scroll, puede obtener colores aleatorios para el mismo, viewesto puede no verse bien, para evitar esto, puede usar la segunda solución.

2.Segunda solución

Puede usar en ColorGenerator.DEFAULTlugar de ColorGenerator.MATERIALsegún su elección. También puede usar cualquiera en numberlugar deposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);
Sagar
fuente
¿Qué es ese ColorGenerator? De donde lo sacas
orelzion