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!

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 ...


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


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ść.


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

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


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

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

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

0
bb.setBackgroundColor(Color.rgb(
    getRandomInteger(0,255),
    getRandomInteger(0, 255),
    getRandomInteger(0, 255)
));

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


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

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

W Kotlinie:

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

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

co to za ColorGenerator? Skąd to masz?
orelzion
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.