Смешивание цветов в android

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

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

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

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

редактировать:

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

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

7 ответов


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

вы можете смешивать биты в hexs:

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

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

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

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

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


посмотреть ArgbEvaluator (начиная с API 11) http://developer.android.com/reference/android/animation/ArgbEvaluator.html


Если цвета находятся в пространстве 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


этот пример может быть полезен, если вы хотите смешать два цвета (передний план и фон). На основе Орландо Лейте answare и Википедии 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 в смешивании. Цвет фона может быть виден только I передний план альфа меньше, чем 100%


В Android вы можете работать с цветами с помощью Color класса.

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

int color = Color.BLACK;

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

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