Android: wygenerować losowy kolor po kliknięciu?

96

Mam program ImageView, w którym programowo tworzę rysunki i prezentuję je użytkownikowi. Moim celem jest kliknięcie wspomnianego ImageViewi zmiana koloru rysunku.

Jak bym zabrał się do losowej zmiany koloru? Ja obecnie majstrować Random(), Color.argb()i kilka innych rzeczy, ale nie wydaje się uzyskać go do pracy!

Jared
źródło

Odpowiedzi:

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

lub

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

Chociaż w twoim przypadku wydaje się, że chcesz stworzyć nowy element do rysowania i przypisać go do swojego widoku. Co właściwie można wyciągnąć w twoim przypadku? Czy to obraz, kształt, wypełnienie ...

Lumis
źródło
15
Czy nie powinno to być 256 zamiast 255 wszędzie? API for nextInt () mówi: „Zwraca pseudolosowy, równomiernie rozłożony int w półotwartym zakresie [0, n)”
Catalin Morosan
1
Kaciula, masz rację n jest wykluczone: docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html
Lumis
int color = 0xFF000000 | rnd.nextInt (0xFFFFFF); „użyj tylko 1 losowego zamiast 3”
Umesh Chhabra
Funkcja Color.argb wymaga API co najmniej 26 do działania.
To Enam,
@ That'sEnam nope, są dwie funkcje Color.argb, jedna przyjmuje argumenty int i istnieje od poziomu API 1, ta, o której mówisz, przyjmuje argumenty typu float i tak, jest dopiero od API 26
Shane Monks O'Byrne
16

aby uzyskać losowe wartości kolorów, możesz użyć tej metody:

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

następnie zastosuj do swoich opinii:

myView.setBackgroundColor(getRandomColor());

wprowadź opis obrazu tutaj

Jorgesys
źródło
13

Jeśli więc szukasz pięknej palety kolorów, może nie jest to dobry pomysł, aby użyć całkowicie przypadkowych wartości. Takie podejście może nie przynieść najlepszych rezultatów, zawsze kończy się wyborem podobnych kolorów, które są zbyt ciemne lub zbyt jasne.

Podejście półlosowe:

Jeśli potrzebujesz świeżych i lśniących kolorów, użyj następującej prostej klasy, którą napisałem wcześniej, gdy miałem te same problemy. Jest semi-randomi używa predefiniowanej palety kolorów:

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

Losowa klasa generatora kolorów dla Androida


Losowe podejście:

Ale jeśli nadal rozważasz użycie random approach, możesz użyć tej pojedynczej linii zamiast wielu linii kodu:

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

Losowy generator kolorów na Androida

Celem tego (0xFF << 24)jest ustawienie wartości alfa na maksimum, co oznacza zerową przezroczystość.

ucMedia
źródło
1
Twój jest najlepszy dla przypadku kontrolowanego projektu ;-)
nemesisfixx
5

Spotkałem to i to jest mój kod, niech trochę pomoże

 /**
 * 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
źródło
a gdzie jest metoda rgb?
Rachit Mishra
@twntee rgb to metoda statyczna patrz: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww
rozumiem! w rzeczywistości było wiele importów w moim pliku z nazwą zapisu?
Rachit Mishra
5
thing.setBackgroundColor(new Random().nextInt());
Gary Davies
źródło
1

To jest mój kod, którego użyłem w aplikacji, może ci pomóc.

Po dotknięciu generuje losowy kolor

 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
źródło
Co to dokładnie robi? Wygląda na to, że ma to na celu uwzględnienie pozycji dotyku
Kartik Chugh,
zmieni tło widoku na dotyk, kiedy dotkniesz i poruszysz, wygeneruje losowy kolor zgodnie z pozycją xy i zastosuje do widoku
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
źródło
Ten kod generuje niebieski wielokrotnie, nie jest losowy
Hitesh Sahu
1

Możesz użyć ColorGenerator do wybrania losowego koloru

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

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

Jeśli chcesz mieć ten sam określony kod kolorów dla powtarzających się tych samych nazw użytkowników. możesz użyć jak poniżej

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;
    }
Król Mszy
źródło
0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));
Mukesh Patil
źródło
0

Najdokładniejsze rozwiązanie tego problemu:

-Najpierw dodaj to w gradle (aplikacja),

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

następnie skompiluj i przebuduj aplikację.

-Drugi krok po prostu użyj go w ten sposób,

RandomColor randomColor = new RandomColor();

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

Link referencyjny:

https://github.com/lzyzsd/AndroidRandomColor

Sohaib Aslam
źródło
0

W twoim przypadku powinieneś polubić tutaj, to dla mnie praca

@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);
}
Максим Сыроватка
źródło
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
źródło
0

W Kotlinie:

val rnd = Random()
val color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
myView.setBackgroundColor(color)
paul_f
źródło
0

Mam nadzieję, że poniższe dwa rozwiązania mogą ci pomóc.

Istnieją dwa sposoby na programowe uzyskanie losowych kolorów view

1. pierwsze rozwiązanie

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

Jeśli używasz in adapteron scroll, możesz uzyskać losowe kolory dla tego samego, viewmoże to nie wyglądać dobrze, aby tego uniknąć, możesz użyć drugiego rozwiązania.

2. drugie rozwiązanie

Możesz użyć ColorGenerator.DEFAULTzamiast według ColorGenerator.MATERIALwłasnego wyboru. Możesz także użyć dowolnego numberzamiastposition

 ColorGenerator generator = ColorGenerator.MATERIAL; 
    int color = generator.getColor(position);
    holder.mEvent_color_strip.setBackgroundColor(color);
Sagar
źródło
co to za ColorGenerator? Skąd to masz?
orelzion