Смешивание цветов в Android - PullRequest
9 голосов
/ 20 мая 2011

Я работаю над приложением, в котором у меня есть пять цветов: красный, зеленый, синий, желтый, фиолетовый

Я хочу реализовать смешение цветов из этих цветов: так, как будто есть пять кнопок для каждого цвета.

Пользователь нажимает любую цветовую кнопку, которая смешивает этот цвет с ранее нарисованным цветом.

Я не имею ни малейшего понятия, как добавить два цветовых кода и получить третий цвет.

РЕДАКТИРОВАТЬ:

Я также должен установить этот цвет для растрового изображения изображения

как я могу установить это?

Ответы [ 7 ]

17 голосов
/ 18 июня 2014

SlidingTabStrip имеет действительно полезный метод смешивания цветов, отлично смотрится при использовании с ViewPager:

private static int blendColors(int color1, int color2, float ratio) {
    final float inverseRation = 1f - ratio;
    float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
    float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
    float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
    return Color.rgb((int) r, (int) g, (int) b);
}
17 голосов
/ 27 июля 2016

С апреля 2015 года вы можете использовать метод blendARGB из библиотеки поддержки v4:

int resultColor = ColorUtils.blendARGB(color1, color2, 0.5F);

Значение отношения должно быть 0,5, чтобы достичь равномерного микширования.

11 голосов
/ 18 ноября 2013

Альтернативный ответ:

Вы можете смешивать биты в гексах:

public static int mixTwoColors( int color1, int color2, float amount )
{
    final byte ALPHA_CHANNEL = 24;
    final byte RED_CHANNEL   = 16;
    final byte GREEN_CHANNEL =  8;
    final byte BLUE_CHANNEL  =  0;

    final float inverseAmount = 1.0f - amount;

    int a = ((int)(((float)(color1 >> ALPHA_CHANNEL & 0xff )*amount) +
                   ((float)(color2 >> ALPHA_CHANNEL & 0xff )*inverseAmount))) & 0xff;
    int r = ((int)(((float)(color1 >> RED_CHANNEL & 0xff )*amount) +
                   ((float)(color2 >> RED_CHANNEL & 0xff )*inverseAmount))) & 0xff;
    int g = ((int)(((float)(color1 >> GREEN_CHANNEL & 0xff )*amount) +
                   ((float)(color2 >> GREEN_CHANNEL & 0xff )*inverseAmount))) & 0xff;
    int b = ((int)(((float)(color1 & 0xff )*amount) +
                   ((float)(color2 & 0xff )*inverseAmount))) & 0xff;

    return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL;
}
6 голосов
/ 16 июля 2014
3 голосов
/ 15 мая 2015

Этот пример может быть полезен, если вы хотите смешать два цвета (передний план и фон).Основанный на ANSware и википедии Orlando Leite http://en.wikipedia.org/wiki/Alpha_compositing, правильный способ смешивания двух цветов с альфа-каналом:

public static int MergeColors(int backgroundColor, int foregroundColor) {
    final byte ALPHA_CHANNEL = 24;
    final byte RED_CHANNEL   = 16;
    final byte GREEN_CHANNEL =  8;
    final byte BLUE_CHANNEL  =  0;

    final double ap1 = (double)(backgroundColor >> ALPHA_CHANNEL & 0xff) / 255d;
    final double ap2 = (double)(foregroundColor >> ALPHA_CHANNEL & 0xff) / 255d;
    final double ap = ap2 + (ap1 * (1 - ap2));

    final double amount1 = (ap1 * (1 - ap2)) / ap;
    final double amount2 = amount1 / ap;

    int a = ((int)(ap * 255d)) & 0xff;

    int r = ((int)(((float)(backgroundColor >> RED_CHANNEL & 0xff )*amount1) +
            ((float)(foregroundColor >> RED_CHANNEL & 0xff )*amount2))) & 0xff;
    int g = ((int)(((float)(backgroundColor >> GREEN_CHANNEL & 0xff )*amount1) +
            ((float)(foregroundColor >> GREEN_CHANNEL & 0xff )*amount2))) & 0xff;
    int b = ((int)(((float)(backgroundColor & 0xff )*amount1) +
            ((float)(foregroundColor & 0xff )*amount2))) & 0xff;

    return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL;
}

В этом случае альфа-канал используется для вычисления процентной доли RGB в смешивании.Цвет фона может быть виден только в том случае, если альфа на переднем плане меньше 100%

3 голосов
/ 20 мая 2011

Если цвета находятся в пространстве RGB, это довольно просто (но результат иногда не так уж и удовлетворителен):

public int mixColors(int col1, int col2) {
    int r1, g1, b1, r2, g2, b2;

    r1 = Color.red(col1);
    g1 = Color.green(col1);
    b1 = Color.blue(col1);

    r2 = Color.red(col2);
    g2 = Color.green(col2);
    b2 = Color.blue(col2);

    int r3 = (r1 + r2)/2;
    int g3 = (g1 + g2)/2;
    int b3 = (b1 + b2)/2;

    return Color.rgb(r3, g3, b3);
}

Если вы хотите использовать другие цветовые пространства, найдите в Википедии и найдите цветовое пространство HSL,У вас также есть несколько библиотек, чтобы сделать это для вас.

Тогда вам нужно будет прочитать этот вопрос: Расчет смешанного цвета в RGB

1 голос
/ 20 мая 2011

В Android вы можете работать с цветами, используя класс Color.

С помощью этого класса вы можете получить доступ к компонентам цвета Red, Green и Blue, чтобы вы могли затем выполнять операции с нимии применять цветовые алгоритмы.Вы можете извлечь цветовые компоненты из цвета int следующим образом:

int color = Color.BLACK;

int red, green, blue;
red = Color.red(color);
green = Color.green(color);
blue = Color.blue(color);

Каждое значение должно быть в диапазоне от 0 до 255, поэтому, когда вы смешиваете два цвета вместе, вы должны либо поделить значение на два, чтобыубедитесь, что конечный результат находится в пределах того же интервала, или примените другой алгоритм, учитывая тот факт, что каждый компонент цвета имеет различный вес для яркости пикселя.

...