2011-05-20 18 views
5

estoy trabajando en la aplicación en la que tengo cinco colores: rojo, verde, azul, amarillo, púrpuraMezcla de color en Android

Quiero aplicar la mezcla de los colores de los colores: de tal manera que como hay cinco botones de cada color.

Toque el botón de cualquier color que este color mezcle con el color dibujado anteriormente.

No tengo ni idea de cómo agregar dos códigos de color y obtener el tercer color.

Editado:

tengo que configurar también este color de mapa de bits de imageview

¿Cómo puedo fijar esto?

Respuesta

7

una respuesta alternativa:

Usted puede mezclar los bits en los 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; 
} 
+0

¿Qué es 'cantidad '? – HaydenKai

+1

La cantidad que desea de un color mezclado con el otro. Por ejemplo, si quiere 0.3 de color1 y 0.7 de color2, usa mixTwoColors (..., ..., 0.3). –

3

Si los colores están en el espacio RGB, es bastante simple (pero el resultado a veces no es tan satisfactoria):

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

Si desea utilizar otros espacios de color, buscar en Wikipedia y encontrar el espacio de color HSL. También tiene algunas bibliotecas para hacer eso por usted.

A continuación, tendrá que leer esta pregunta: Calculation of a mixed color in RGB

+0

thnx para la respuesta bt tengo 5 colores no solo rgb. –

+0

RGB son los componentes de cada color. Entonces tienes 5 veces RGB. Necesitas combinar la respuesta de Luis Miguel Serrano y la mía. –

+0

Gracias por responder. Pero necesito más espacio de color con el uso de la función anterior en cinco mezclas, se mantendrá en color constante. ¿Qué mejor solía para una mayor mezcla de espacio de color? –

1

En Android se puede trabajar con los colores utilizando la clase Color.

Con esta clase, puede acceder a los componentes Rojo, Verde y Azul de un color, para que luego pueda realizar operaciones con ellos y aplicar algoritmos de color. Puede extraer los componentes de color de un int de color de esta manera:

int color = Color.BLACK; 

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

cada valor debe estar entre 0 y 255, por lo que cuando se mezclan dos colores juntos, usted debe ya sea dividir el valor por dos, para asegurarse el resultado final está dentro del mismo intervalo, o aplique otro algoritmo teniendo en cuenta el hecho de que cada componente de color tiene un peso diferente para la luminancia de un píxel.

+0

Punto de bonificación para detectar Color.red, Color.green, Color.blue & c. Debería estar usando estos. Aunque la respuesta aceptada (mixTwoColors) proporciona una implementación completa que podría hacerse un poco más elegante con los métodos Color.xxx. –

16

SlidingTabStrip tiene método muy útil para la mezcla de colores, se ve muy bien cuando se utiliza con 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); 
} 
+0

¿Qué es 'ratio'? – HaydenKai

5
+0

Genial, lo uso para teñir colores que ya tienen mucha claridad, al mezclar el color con blanco. Funciona genial. – Ridcully

+0

Selección de API de Bizzre por los desarrolladores de Android. Innecesariamente requiere una instancia. No hace falta tomar los parámetros del Objeto que rápidamente se lanzan a Integer. No se debe utilizar en el dibujo o el código de animación en tiempo real debido a las asignaciones de boxeo y desempaquetado. Entonces tú sabes. (Gracias al póster original; no gracias al desarrollador de Android que escribió esta atrocidad). Mejor solo deslizar los otros fragmentos de código en esta publicación. –

1

Este ejemplo puede ser útil si desea combinar dos colores (primer plano y fondo). Basado en Orlando Leite Answare y wikipedia http://en.wikipedia.org/wiki/Alpha_compositing, forma correcta de mezclar dos colores con alfa es:

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

En este canal alfa caso se utiliza para calcular porcentaje RGB en mezcla.El color de fondo puede ser visible sólo i alfa primer plano es menor que 100%

+0

¡mejor respuesta todavía! –

10

Desde abril de 2015 puede utilizar blendARGB method de biblioteca de soporte v4:

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

valor de relación tiene que ser de 0,5 a achive incluso mezclar.

+0

¡Perfecto también para configurar tonalidades más claras/más oscuras de un color! – mjp66

+0

El tercer argumento es la proporción (la proporción al mezclar los colores). p.ej. Si desea un 30% de color1 y un 70% de color2, realice ColorUtils.blendARGB (***, ***, 0.3F); –

Cuestiones relacionadas