Android: Tạo màu ngẫu nhiên khi nhấp chuột?


95

Tôi có một ImageView, trong đó tôi đang lập trình tạo các ngăn kéo và trình bày chúng cho người dùng. Mục tiêu của tôi là nhấp vào đã nói ImageViewvà thay đổi màu có thể vẽ.

Tôi sẽ làm thế nào về bit thay đổi màu ngẫu nhiên? Tôi hiện đang mày mò với Random(), Color.argb()và một vài điều khác, nhưng tôi dường như không thể làm cho nó làm việc!

Câu trả lời:


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

hoặc là

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

Mặc dù trong trường hợp của bạn, có vẻ như bạn muốn tạo một bản vẽ mới và gán nó cho chế độ xem của bạn. Điều gì thực sự có thể rút ra trong trường hợp của bạn? Nó có phải là một hình ảnh, hình dạng, tô màu ...


15
Nó không phải là 256 thay vì 255 ở mọi nơi? API cho nextInt () cho biết "Trả về một số int được phân phối đồng nhất giả ngẫu nhiên trong phạm vi nửa mở [0, n)"
Catalin Morosan 28/10/11

1
Kaciula, bạn đã đúng, thứ n bị loại trừ: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis

int color = 0xFF000000 | rnd.nextInt (0xFFFFFF); "Chỉ sử dụng 1 ngẫu nhiên thay vì 3"
Umesh Chhabra

Hàm color.argb yêu cầu API ít nhất 26 để hoạt động.
Đó là Enam

@ ThatEnam nope, có hai hàm Color.argb, một hàm lấy đối số int và đã tồn tại từ API cấp 1, hàm mà bạn đang nói đến lấy đối số float và vâng, chỉ có từ API 26
Shane Monks O'Byrne

16

để nhận các giá trị màu ngẫu nhiên, bạn có thể sử dụng phương pháp này:

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

sau đó áp dụng cho quan điểm của bạn:

myView.setBackgroundColor(getRandomColor());

nhập mô tả hình ảnh ở đây


13

Vì vậy, nếu bạn đang tìm kiếm một bảng màu đẹp, có lẽ đó không phải là một ý tưởng tuyệt vời để sử dụng các giá trị hoàn toàn ngẫu nhiên. Cách tiếp cận này có thể không mang lại kết quả tốt nhất, Nó luôn dẫn đến việc lựa chọn các màu tương tự như quá tối hoặc quá sáng.

Cách tiếp cận bán ngẫu nhiên:

Nếu bạn cần một số màu sắc tươi và sáng bóng thì hãy sử dụng lớp đơn giản sau mà tôi đã viết trước đây khi gặp vấn đề tương tự. Nó semi-randomvà sử dụng một bảng màu được xác định trước:

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

Lớp tạo màu ngẫu nhiên cho Android


Cách tiếp cận ngẫu nhiên:

Nhưng nếu bạn vẫn đang cân nhắc sử dụng, random approachbạn có thể muốn sử dụng một dòng duy nhất này thay vì nhiều dòng mã:

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

Máy tạo màu ngẫu nhiên android

Mục đích của việc sử dụng này (0xFF << 24)là đặt giá trị alpha ở mức tối đa có nghĩa là độ trong suốt bằng không.


1
Yours là tốt nhất cho một trường hợp thiết kế kiểm soát ;-)
nemesisfixx

5

Tôi đã gặp điều này và đây là mã của tôi, Mong một số giúp đỡ

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

và đâu là phương thức rgb?
Rachit Mishra

@twntee rgb là một phương thức tĩnh, hãy xem: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww

đúng rồi! thực sự có nhiều lần nhập trong tệp của tôi với tên lưu?
Rachit Mishra


1

Đây là mã của tôi mà tôi đã sử dụng trong một ứng dụng, nó có thể giúp ích cho bạn.

Nó tạo ra một màu ngẫu nhiên khi chạm vào

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

Chính xác thì điều này làm gì? Dường như nó có nghĩa là yếu tố ở vị trí của các liên lạc
Kartik Chugh

nó sẽ thay đổi nền của quan điểm trên cảm ứng, khi bạn chạm và di chuyển, nó sẽ tạo ra màu sắc ngẫu nhiên theo vị trí xy và áp dụng đối với quan điểm
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);
}

Mã này tạo ra Blue nhiều lần, không phải ngẫu nhiên
Hitesh Sahu

1

Bạn có thể sử dụng ColorGenerator để chọn màu ngẫu nhiên

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

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

Nếu bạn muốn có cùng một mã màu cụ thể cho các tên người dùng lặp lại giống nhau. bạn có thể sử dụng như dưới đây

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

Giải pháp chính xác nhất của vấn đề này:

-Đầu tiên, thêm cái này vào gradle (ứng dụng),

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

sau đó biên dịch và xây dựng lại ứng dụng.

-Bước thứ hai chỉ cần sử dụng nó theo cách này,

RandomColor randomColor = new RandomColor();

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

Liên kết tham khảo:

https://github.com/lzyzsd/AndroidRandomColor


0

Trong trường hợp của bạn, bạn nên làm như ở đây, đó là việc của tôi

@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

Trong Kotlin:

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

0

Tôi hy vọng hai giải pháp sau đây có thể giúp bạn.

Có hai cách để lấy màu ngẫu nhiên theo lập trình để đặt thành view

1. giải pháp đầu tiên

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

Nếu bạn đang sử dụng adaptertrên cuộn, bạn có thể nhận được các màu ngẫu nhiên giống nhau, viewđiều này có thể không đẹp, để tránh điều này, bạn có thể sử dụng giải pháp thứ hai.

2. giải pháp thứ hai

Bạn có thể sử dụng ColorGenerator.DEFAULTthay vì ColorGenerator.MATERIALtheo sự lựa chọn của bạn. Bạn cũng có thể sử dụng bất kỳ numberthay vìposition

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

ColorGenerator đó là gì? Bạn lấy nó từ đâu?
orelzion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.