Android: generare colori casuali al clic?


95

Ho un ImageView, in cui creo programmaticamente i drawables e li presento all'utente. Il mio obiettivo è fare clic su detto ImageViewe cambiare il colore del disegno.

Come dovrei affrontare il bit che cambia colore casuale? Attualmente sto armeggiare con Random(), Color.argb()e un paio di altre cose, ma io non riesco a farlo funzionare!

Risposte:


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

Anche se nel tuo caso sembra che tu voglia creare un nuovo disegnabile e assegnarlo alla tua vista. Qual è effettivamente il disegnabile nel tuo caso? È un'immagine, una forma, un riempimento ...


15
Non dovrebbe essere 256 invece di 255 ovunque? L'API per nextInt () dice "Restituisce un int pseudo-casuale distribuito uniformemente nell'intervallo semiaperto [0, n)"
Catalin Morosan

1
Kaciula, hai ragione la n è esclusa: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis

int color = 0xFF000000 | rnd.nextInt (0xFFFFFF); "usa solo 1 casuale invece di 3"
Umesh Chhabra

La funzione Color.argb richiede API almeno 26 per funzionare.
Questo è Enam

@ That'sEnam no, ci sono due funzioni Color.argb, una accetta argomenti int ed esiste dal livello API 1, quella di cui stai parlando accetta argomenti float e sì, è solo dall'API 26
Shane Monks O'Byrne

16

per ottenere valori di colore casuali puoi usare questo metodo:

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

quindi applica alle tue visualizzazioni:

myView.setBackgroundColor(getRandomColor());

inserisci qui la descrizione dell'immagine


13

Quindi, se stai cercando una bella tavolozza di colori, forse non è una grande idea usare valori totalmente casuali. Questo approccio potrebbe non dare i migliori risultati, finisce sempre con una selezione di colori simili che sono troppo scuri o troppo luminosi.

Approccio semi-casuale:

Se hai bisogno di colori freschi e brillanti, usa la seguente semplice classe, che ho scritto in precedenza quando avevo gli stessi problemi. È semi-randome utilizza una tavolozza di colori predefinita:

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 per Android


Approccio casuale:

Ma se stai ancora valutando l'uso, random approachpotresti voler usare questa singola riga invece di più righe di codice:

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

Generatore di colori casuali Android

Lo scopo di utilizzare questo (0xFF << 24)è impostare il valore alfa al massimo che significa trasparenza zero.


1
Il tuo è il migliore per un caso di progettazione controllata ;-)
nemesisfixx

5

Ho incontrato questo e questo è il mio codice, può essere d'aiuto

 /**
 * 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 dov'è il metodo rgb?
Rachit Mishra

@twntee rgb è un metodo statico vedere: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww

sì, capito! in realtà c'erano più importazioni nel mio file con il nome di salvataggio?
Rachit Mishra


1

Questo è il mio codice che ho usato in un'applicazione, potrebbe aiutarti.

Genera un colore casuale al tatto

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

Cosa fa esattamente? Sembra che sia pensato per tenere conto della posizione del tocco
Kartik Chugh

cambierà lo sfondo della vista al tocco, quando tocchi e ti sposti, genererà un colore casuale in base alla posizione xy e si applicherà alla 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);
}

Questo codice genera blu più volte, non è casuale
Hitesh Sahu

1

Puoi usare ColorGenerator per scegliere il colore casuale

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

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

Se vuoi avere lo stesso codice colore specifico per gli stessi nomi utente ripetuti. puoi usare come sotto

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

Soluzione più accurata di questo problema:

-In primo luogo, aggiungi questo nel gradle (app),

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

quindi compila e ricostruisci l'app.

-Il secondo passaggio usalo in questo modo,

RandomColor randomColor = new RandomColor();

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

Link di riferimento:

https://github.com/lzyzsd/AndroidRandomColor


0

Nel tuo caso dovresti fare come qui, per me funziona

@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

A Kotlin:

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

0

Spero che le seguenti due soluzioni possano aiutarti.

Esistono due modi per ottenere colori casuali a livello di programmazione su cui impostare view

1.Prima soluzione

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

Se stai usando lo adapterscroll potresti ottenere colori casuali per lo stesso viewquesto potrebbe non sembrare buono, per evitarlo puoi usare la seconda soluzione.

2.Seconda Soluzione

Puoi usare ColorGenerator.DEFAULTinvece di ColorGenerator.MATERIALsecondo la tua scelta. Puoi anche usare qualsiasi numberinvece diposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);

cos'è quel ColorGenerator? Da dove lo prendi?
orelzion
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.