Android: генерировать случайный цвет при нажатии?


96

У меня есть ImageViewфайл, в котором я программно создаю чертежи и представляю их пользователю. Моя цель - нажать на сказанное ImageViewи изменить цвет чертежа.

Как мне сделать случайное изменение цвета? Я в настоящее время переделывая Random(), Color.argb()и несколько других вещей, но я не могу получить его на работу!

Ответы:


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

Хотя в вашем случае кажется, что вы хотите создать новый объект для рисования и назначить его своему представлению. Что на самом деле можно рисовать в вашем случае? Это изображение, форма, заливка ...


15
Разве не должно быть 256 вместо 255 везде? API для nextInt () говорит: «Возвращает псевдослучайное равномерно распределенное int в полуоткрытом диапазоне [0, n)»
Каталин Моросан

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»
Умеш Чхабра 01

Функция Color.argb требует для работы API не менее 26.
Это Энам

@ ThatEnam нет, есть две функции Color.argb, одна принимает аргументы int и существует с уровня API 1, та, о которой вы говорите, принимает аргументы с плавающей запятой, и да, только с API 26
Шейн Монкс О'Бирн

16

чтобы получить случайные значения цвета, вы можете использовать этот метод:

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

затем примените к своим представлениям:

myView.setBackgroundColor(getRandomColor());

введите описание изображения здесь


13

Так что, если вы ищете красивую цветовую палитру, возможно, это не такая уж хорошая идея - использовать полностью случайные значения. Такой подход может не дать наилучших результатов, он всегда приводит к выбору похожих цветов, слишком темных или слишком ярких.

Полуслучайный подход:

Если вам нужны свежие и блестящие цвета, используйте следующий простой класс, который я написал ранее, когда у меня были такие же проблемы. Он 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;
    }
}

Класс генератора случайных цветов для android


Случайный подход:

Но если вы все еще random approachдумаете об использовании, вы можете использовать эту единственную строку вместо нескольких строк кода:

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

Генератор случайных цветов android

Цель использования (0xFF << 24)- установить максимальное значение альфа, что означает нулевую прозрачность.


1
Ваш лучший вариант для контролируемого дизайна ;-)
nemesisfixx

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?
Рахит Мишра 06

@twntee rgb - это статический метод, см .: [ developer.android.com/reference/android/graphics/… , int, int)]
acntwww 08

да понял! на самом деле в моем файле было несколько операций импорта с именем сохранения?
Рахит Мишра


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

Что именно это делает? Похоже, это должно учитывать позицию касания
Картик Чуг

он изменит фон просмотра при касании, когда вы коснетесь и двигаетесь, он будет генерировать случайный цвет в соответствии с положением 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);
}

Этот код генерирует синие несколько раз, его не случайный
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

Наиболее точное решение этой проблемы:

-Сначала добавьте это в градиент (приложение),

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

В Котлине:

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

что это за ColorGenerator? Откуда ты это взял?
Орелзион
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.