Pregunta

Me pregunto si alguien podría sugerir la mejor manera de pasar de un color a otro en un proceso gradual.

Por lo tanto - Tengo un cuadro de texto que no tengo un límite de texto en. Me gustaría tener el inicio de texto en blanco, pero ser de color rojo en el momento en que llega al límite de texto máx.

¿Hay una manera fácil de hacer esto? No estoy seguro realmente por dónde empezar ...

¿Fue útil?

Solución

Uso HSL o HSV en lugar de RGB. Ellos tienen varias propiedades que van de 0 a 100 por ciento, por lo que puede ampliar su escala muy bien en el código.

A continuación de la referencia c objetivo

Otros consejos

Aquí es una categoría para UIColor que se puede usar para interpolar linealmente entre dos UIColors en RGB o HSV:

@implementation UIColor (Interpolate)

+ (UIColor *)interpolateRGBColorFrom:(UIColor *)start to:(UIColor *)end withFraction:(float)f {

    f = MAX(0, f);
    f = MIN(1, f);

    const CGFloat *c1 = CGColorGetComponents(start.CGColor);
    const CGFloat *c2 = CGColorGetComponents(end.CGColor);

    CGFloat r = c1[0] + (c2[0] - c1[0]) * f;
    CGFloat g = c1[1] + (c2[1] - c1[1]) * f;
    CGFloat b = c1[2] + (c2[2] - c1[2]) * f;
    CGFloat a = c1[3] + (c2[3] - c1[3]) * f;

    return [UIColor colorWithRed:r green:g blue:b alpha:a];
}

+ (UIColor *)interpolateHSVColorFrom:(UIColor *)start to:(UIColor *)end withFraction:(float)f {

    f = MAX(0, f);
    f = MIN(1, f);

    CGFloat h1,s1,v1,a1;
    [start getHue:&h1 saturation:&s1 brightness:&v1 alpha:&a1];

    CGFloat h2,s2,v2,a2;
    [end getHue:&h2 saturation:&s2 brightness:&v2 alpha:&a2];

    CGFloat h = h1 + (h2 - h1) * f;
    CGFloat s = s1 + (s2 - s1) * f;
    CGFloat v = v1 + (v2 - v1) * f;
    CGFloat a = a1 + (a2 - a1) * f;

    return [UIColor colorWithHue:h saturation:s brightness:v alpha:a];
}

@end

lo hacen con interpolación lineal simple. Flotador es de precisión.

float dr = (r_end - r_start) / (text_limit*1.0 - 1);
float dg = (g_end - g_start) / (text_limit*1.0 - 1);
float db = (b_end - b_start) / (text_limit*1.0 - 1);
int x = start_x;
for(int i=0; i<text_size; ++i)
{
    PutOutColoredChar(x,start_y , text[i], (int)(r_start+(dr*i)) , ((int)g_start+(dg*i)), (int)(g_start+(db*i)) );
    x += WithOfChar(text[i]);
}

No soy un experto en color pero esto no solía ser feo para mí.

es necesario convertir los colores de punto final a un espacio de color donde uno de los parámetros es la intensidad para que pueda mantener esta constante. @ Sugerencia de jvenema es decente. A continuación, el tratamiento de los otros dos valores como dos puntos en 2-dimensiones, y encontrar el punto correcto a lo largo de la línea de conexión de acuerdo a la posición del cursor. Convertir la parte posterior de color resultante a RGB para la visualización.

También puede intentar blendedColorWithFraction de NSColor: ofColor :, dependiendo de la forma en que se funde, puede hacer lo que quiera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top