Android: générer des couleurs aléatoires au clic?

95

J'ai un ImageView, dans lequel je crée des dessinables par programmation et les présente à l'utilisateur. Mon objectif est de cliquer sur dit ImageViewet de changer la couleur du dessin.

Comment pourrais-je procéder au changement de couleur aléatoire? Je suis en train de bricoler Random(), Color.argb()et quelques autres choses, mais je n'arrive pas à le faire fonctionner!

Jared
la source

Réponses:

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

Bien que dans votre cas, il semble que vous souhaitiez créer un nouveau dessinable et l'assigner à votre vue. Quel est réellement le dessinable dans votre cas? Est-ce une image, une forme, un remplissage ...

Lumis
la source
15
Ne devrait-il pas être 256 au lieu de 255 partout? L'API pour nextInt () dit "Renvoie un int pseudo-aléatoire uniformément distribué dans la plage semi-ouverte [0, n)"
Catalin Morosan
1
Kaciula, vous avez raison, le n est exclu: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis
couleur int = 0xFF000000 | rnd.nextInt (0xFFFFFF); "utiliser seulement 1 aléatoire au lieu de 3"
Umesh Chhabra
La fonction Color.argb nécessite une API d'au moins 26 pour fonctionner.
C'est Enam
@ That'sEnam non, il y a deux fonctions Color.argb, l'une prend des arguments int et existe depuis le niveau d'API 1, celle dont vous parlez prend des arguments flottants et oui, c'est seulement depuis l'API 26
Shane Monks O'Byrne
16

pour obtenir des valeurs de couleur aléatoires, vous pouvez utiliser cette méthode:

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

puis appliquez à vos vues:

myView.setBackgroundColor(getRandomColor());

entrez la description de l'image ici

Jorgesys
la source
13

Donc, si vous recherchez une belle palette de couleurs, ce n'est peut-être pas une si bonne idée d'utiliser des valeurs totalement aléatoires. Cette approche peut ne pas donner les meilleurs résultats, elle se termine toujours par une sélection de couleurs similaires trop sombres ou trop lumineuses.

Approche semi-aléatoire:

Si vous avez besoin de couleurs fraîches et brillantes, utilisez la classe simple suivante, que j'ai écrite précédemment lorsque j'ai eu les mêmes problèmes. C'est semi-randomet utilise une palette de couleurs prédéfinie:

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 de générateur de couleurs aléatoires pour Android


Approche aléatoire:

Mais si vous envisagez toujours d'utiliser, random approachvous pouvez utiliser cette seule ligne au lieu de plusieurs lignes de code:

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

Générateur de couleurs aléatoires android

Le but de son utilisation (0xFF << 24)est de définir la valeur alpha au maximum, ce qui signifie une transparence nulle.

ucMedia
la source
1
Le vôtre est le meilleur pour un cas de conception contrôlée ;-)
nemesisfixx
5

J'ai rencontré ceci et ceci est mon code, peut-être un peu d'aide

 /**
 * 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
la source
et où est la méthode rgb?
Rachit Mishra
@twntee rgb est une méthode statique voir: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww
yup compris! réellement il y avait plusieurs importations dans mon fichier avec le nom de sauvegarde?
Rachit Mishra
5
thing.setBackgroundColor(new Random().nextInt());
Gary Davies
la source
1

C'est mon code que j'ai utilisé dans une application, cela peut vous aider.

Il génère une couleur aléatoire au toucher

 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
la source
Qu'est-ce que cela fait exactement? On dirait que c'est censé tenir compte de la position du toucher
Kartik Chugh
cela changera l'arrière-plan de la vue au toucher, lorsque vous touchez et bougez, il générera une couleur aléatoire en fonction de la position xy et s'appliquera à la vue
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
la source
Ce code génère du bleu plusieurs fois, ce n'est pas aléatoire
Hitesh Sahu
1

Vous pouvez utiliser ColorGenerator pour choisir la couleur aléatoire

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

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

Si vous souhaitez avoir le même code couleur spécifique pour les mêmes noms d'utilisateur répétés. vous pouvez utiliser comme ci-dessous

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;
    }
Roi des messes
la source
0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));
Mukesh Patil
la source
0

Solution la plus précise de ce problème:

-Tout d'abord, ajoutez ceci dans le gradle (app),

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

puis compilez et reconstruisez l'application.

-La deuxième étape utilise-le de cette façon,

RandomColor randomColor = new RandomColor();

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

Lien de référence:

https://github.com/lzyzsd/AndroidRandomColor

Sohaib Aslam
la source
0

Dans ton cas tu devrais faire comme ici, c'est du travail pour moi

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

À Kotlin:

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

J'espère que les deux solutions suivantes pourront vous aider.

Il existe deux façons d'obtenir des couleurs aléatoires par programme pour définir view

1. première solution

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

Si vous utilisez in adapteron scroll, vous pouvez obtenir des couleurs aléatoires pour la même chose, viewcela peut ne pas sembler bon, pour éviter cela, vous pouvez utiliser la deuxième solution.

2. deuxième solution

Vous pouvez utiliser ColorGenerator.DEFAULTau lieu de ColorGenerator.MATERIALselon votre choix. Vous pouvez également utiliser any numberau lieu deposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);
Sagar
la source
c'est quoi ce ColorGenerator? D'où l'obtiens-tu?
orelzion