Android: Hasilkan warna acak di klik?

96

Saya memiliki ImageView, di mana saya secara terprogram membuat sumber daya dapat digambar dan menampilkannya kepada pengguna. Tujuan saya adalah mengklik kata ImageViewdan mengubah warna drawable.

Bagaimana saya akan mengubah sedikit warna acak? Saat ini saya sedang mengotak-atik Random(), Color.argb()dan beberapa hal lainnya, tetapi sepertinya saya tidak dapat membuatnya bekerja!

Jared
sumber

Jawaban:

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

atau

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

Meskipun dalam kasus Anda, tampaknya Anda ingin membuat drawable baru dan menetapkannya ke tampilan Anda. Apa sebenarnya drawable dalam casing Anda? Apakah itu gambar, bentuk, isi ...

Lumis
sumber
15
Bukankah seharusnya 256 bukannya 255 di mana-mana? API untuk nextInt () mengatakan "Mengembalikan int terdistribusi pseudo-random seragam dalam rentang setengah terbuka [0, n)"
Catalin Morosan
1
Kaciula, Anda benar dan dikecualikan: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis
warna int = 0xFF000000 | rnd.nextInt (0xFFFFFF); "gunakan hanya 1 acak, bukan 3"
Umesh Chhabra
Fungsi Color.argb membutuhkan API setidaknya 26 agar berfungsi.
Itu Enam
@ That'sEnam tidak, ada dua fungsi Color.argb, yang satu mengambil argumen int dan telah ada sejak API level 1, yang Anda bicarakan membutuhkan argumen float dan ya, hanya sejak API 26
Shane Monks O'Byrne
16

untuk mendapatkan nilai warna acak Anda dapat menggunakan metode ini:

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

lalu terapkan ke tampilan Anda:

myView.setBackgroundColor(getRandomColor());

masukkan deskripsi gambar di sini

Jorgesys
sumber
13

Jadi jika Anda mencari palet warna yang indah, Mungkin Ini Bukan Ide Yang Bagus Untuk menggunakan nilai yang benar-benar acak. Pendekatan ini mungkin tidak memberikan hasil terbaik, Itu selalu berakhir dengan pemilihan warna serupa yang terlalu gelap atau terlalu terang.

Pendekatan semi-acak:

Jika Anda membutuhkan beberapa warna segar dan berkilau maka gunakan kelas sederhana berikut, yang saya tulis sebelumnya ketika saya memiliki masalah yang sama. Ini semi-randomdan menggunakan palet warna yang telah ditentukan:

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

Kelas Random Color Generator untuk android


Pendekatan acak:

Tetapi jika Anda masih mempertimbangkan untuk menggunakan, random approachAnda mungkin ingin menggunakan satu baris ini daripada beberapa baris kode:

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

Generator Warna Acak android

Tujuan menggunakan ini (0xFF << 24)adalah untuk mengatur nilai alpha ke maksimum yang berarti transparansi nol.

ucMedia
sumber
1
Milik Anda adalah yang terbaik untuk kasus desain terkontrol ;-)
nemesisfixx
5

Saya bertemu ini dan ini adalah kode saya, Semoga sedikit membantu

 /**
 * 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
sumber
dan di mana metode rgb?
Rachit Mishra
@twntee rgb adalah metode statis lihat: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww
yup mengerti! sebenarnya ada beberapa impor di file saya dengan nama simpan?
Rachit Mishra
5
thing.setBackgroundColor(new Random().nextInt());
Gary Davies
sumber
1

Ini adalah kode saya yang saya gunakan dalam sebuah aplikasi, ini dapat membantu Anda.

Ini menghasilkan warna acak saat disentuh

 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
sumber
Apa sebenarnya fungsi ini? Sepertinya itu dimaksudkan untuk memperhitungkan posisi sentuhan
Kartik Chugh
itu akan mengubah latar belakang tampilan saat disentuh, ketika Anda menyentuh dan bergerak, itu akan menghasilkan warna acak sesuai dengan posisi xy dan berlaku untuk tampilan
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
sumber
Kode ini menghasilkan Biru beberapa kali, tidak acak
Hitesh Sahu
1

Anda dapat menggunakan ColorGenerator untuk memilih warna acak

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

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

Jika Anda ingin memiliki kode warna spesifik yang sama untuk nama pengguna yang sama berulang. Anda bisa menggunakan seperti di bawah ini

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;
    }
King of Masses
sumber
0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));
Mukesh Patil
sumber
0

Solusi Paling Akurat untuk masalah ini:

-Pertama, tambahkan ini di gradle (aplikasi),

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

lalu kompilasi dan bangun kembali aplikasi.

-Langkah kedua gunakan saja dengan cara ini,

RandomColor randomColor = new RandomColor();

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

Tautan Referensi:

https://github.com/lzyzsd/AndroidRandomColor

Sohaib Aslam
sumber
0

Dalam kasus Anda, Anda harus melakukan seperti di sini, itu berhasil bagi saya

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

Di Kotlin:

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

Saya harap dua solusi berikut dapat membantu Anda.

Ada dua cara untuk menyetel warna acak secara terprogram view

1. solusi pertama

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

Jika Anda menggunakan dalam adaptergulungan Anda mungkin mendapatkan warna acak untuk hal yang sama viewini mungkin tidak terlihat bagus, untuk menghindari ini Anda dapat menggunakan solusi kedua.

2. Solusi Kedua

Anda dapat menggunakan ColorGenerator.DEFAULTalih-alih ColorGenerator.MATERIALsesuai pilihan Anda. Anda juga dapat menggunakan apa saja, numberbukanposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);
Sagar
sumber
apa itu ColorGenerator? Dari mana kamu mendapatkannya
orelzion