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!

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


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


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.


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

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


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

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

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

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

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


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

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

À Kotlin:

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

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

c'est quoi ce ColorGenerator? D'où l'obtiens-tu?
orelzion
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.