Android: สร้างสีแบบสุ่มเมื่อคลิก?


99

ฉันมีImageViewซึ่งฉันกำลังสร้างสิ่งที่วาดได้โดยใช้โปรแกรมและนำเสนอให้กับผู้ใช้ เป้าหมายของฉันคือคลิกที่พูดImageViewและเปลี่ยนสีของที่วาดได้

ฉันจะไปเกี่ยวกับบิตเปลี่ยนสีแบบสุ่มได้อย่างไร ฉันกำลังซ่อมRandom(), Color.argb()และบางสิ่งอื่น ๆ แต่ฉันไม่สามารถดูเหมือนจะได้รับมันในการทำงาน!

คำตอบ:


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

หรือ

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

แม้ว่าในกรณีของคุณดูเหมือนว่าคุณต้องการสร้างสิ่งที่วาดได้ใหม่และกำหนดให้กับมุมมองของคุณ อะไรคือสิ่งที่เบิกได้ในกรณีของคุณ? เป็นภาพรูปร่างเติม ...


16
ไม่ควรเป็น 256 แทนที่จะเป็น 255 ทุกที่? API สำหรับ nextInt () ระบุว่า "ส่งคืน int สุ่มแบบสุ่มที่กระจายอย่างสม่ำเสมอในช่วงครึ่งเปิด [0, n)"
Catalin Morosan

1
Kaciula คุณถูกต้องที่ n ถูกยกเว้น: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis

int color = 0xFF000000 | rnd.nextInt (0xFFFFFF); "ใช้เพียง 1 สุ่มแทนที่จะเป็น 3"
Umesh Chhabra

ฟังก์ชัน Color.argb ต้องการ API อย่างน้อย 26 ในการทำงาน
นั่นคือ Enam

@ That'sEnam nope มีฟังก์ชัน Color.argb สองฟังก์ชันหนึ่งใช้อาร์กิวเมนต์ int และมีอยู่ตั้งแต่ระดับ API 1 อันที่คุณกำลังพูดถึงรับอาร์กิวเมนต์ลอยและใช่มีตั้งแต่ API 26 เท่านั้น
เชนพระโอไบรน์

16

ดังนั้นหากคุณกำลังมองหาจานสีสวย ๆ บางทีมันอาจจะไม่ใช่ไอเดียที่ดีในการใช้ค่าแบบสุ่มทั้งหมด วิธีนี้อาจไม่ได้ผลลัพธ์ที่ดีที่สุด แต่มักจะลงเอยด้วยการเลือกสีที่คล้ายกันซึ่งมืดเกินไปหรือสว่างเกินไป

แนวทางกึ่งสุ่ม:

หากคุณต้องการสีที่สดและมันวาวให้ใช้คลาสง่ายๆต่อไปนี้ที่ฉันเขียนไว้ก่อนหน้านี้เมื่อฉันมีปัญหาเดียวกัน มันsemi-randomและใช้จานสีที่กำหนดไว้ล่วงหน้า:

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

คลาส Random Color Generator สำหรับ Android


แนวทางสุ่ม:

แต่หากคุณยังคงพิจารณาใช้random approachคุณอาจต้องการใช้บรรทัดเดียวนี้แทนโค้ดหลายบรรทัด:

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

หุ่นยนต์สร้างสีสุ่ม

จุดประสงค์ของการใช้นี้(0xFF << 24)คือการตั้งค่าอัลฟาเป็นสูงสุดซึ่งหมายถึงความโปร่งใสเป็นศูนย์


1
ของคุณดีที่สุดสำหรับเคสการออกแบบที่มีการควบคุม ;-)
nemesisfixx

15

ในการรับค่าสีแบบสุ่มคุณสามารถใช้วิธีนี้:

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

จากนั้นนำไปใช้กับมุมมองของคุณ:

myView.setBackgroundColor(getRandomColor());

ป้อนคำอธิบายภาพที่นี่


5

ฉันพบสิ่งนี้และนี่คือรหัสของฉันขอความช่วยเหลือ

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

และวิธี rgb อยู่ที่ไหน?
Rachit Mishra

@twntee rgb เป็นวิธีการคงที่โปรดดู: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww

ได้แล้ว! จริงๆแล้วมีการนำเข้าหลายรายการในไฟล์ของฉันด้วยชื่อบันทึก?
Rachit Mishra


1

นี่คือรหัสของฉันที่ฉันใช้ในแอปพลิเคชันซึ่งอาจช่วยคุณได้

มันสร้างสีแบบสุ่มเมื่อสัมผัส

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

มันทำอะไรกันแน่? ดูเหมือนว่าจะต้องคำนึงถึงตำแหน่งของการสัมผัส
Kartik Chugh

มันจะเปลี่ยนพื้นหลังของมุมมองเมื่อสัมผัสเมื่อคุณสัมผัสและย้ายมันจะสร้างสีแบบสุ่มตามตำแหน่ง xy และนำไปใช้กับมุมมอง
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);
}

รหัสนี้สร้าง Blue หลายครั้งไม่ใช่แบบสุ่ม
Hitesh Sahu

1

คุณสามารถใช้ ColorGenerator เพื่อเลือกสีแบบสุ่ม

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

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

หากคุณต้องการมีรหัสสีเฉพาะสำหรับชื่อผู้ใช้เดียวกันซ้ำ คุณสามารถใช้ดังต่อไปนี้

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

วิธีแก้ปัญหาที่ถูกต้องที่สุด:

- ขั้นแรกให้เพิ่มสิ่งนี้ใน gradle (แอป)

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

จากนั้นคอมไพล์และสร้างแอพใหม่

- ขั้นตอนที่สองเพียงใช้วิธีนี้

RandomColor randomColor = new RandomColor();

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

ลิงค์อ้างอิง:

https://github.com/lzyzsd/AndroidRandomColor


0

ในกรณีของคุณคุณควรทำเช่นที่นี่มันเป็นประโยชน์สำหรับฉัน

@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

ฉันหวังว่าสองวิธีต่อไปนี้อาจช่วยคุณได้

มีสองวิธีในการรับสีแบบสุ่มโดยทางโปรแกรมเพื่อตั้งค่าเป็น view

1. ทางออกแรก

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

หากคุณใช้ในการadapterเลื่อนคุณอาจได้รับสีแบบสุ่มเหมือนกันviewซึ่งอาจดูไม่ดีเพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้วิธีที่สองได้

2. โซลูชันที่สอง

คุณสามารถใช้ColorGenerator.DEFAULTแทนได้ColorGenerator.MATERIALตามที่คุณเลือก คุณยังสามารถใช้อะไรก็ได้numberแทนposition

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

1
ColorGenerator คืออะไร? คุณเอามาจากไหน?
orelzion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.