2

我想知道是否有人可以建议在渐进过程中从一种颜色变为另一种颜色的最佳方法。

所以 - 我有一个文本框,我有一个文本限制。我想让文本从白色开始,但在达到最大文本限制时变为红色。

是否有捷径可寻?我真的不确定从哪里开始......

4

4 回答 4

3

这是一个类别UIColor,可用于UIColor在 RGB 或 HSV 中的两个 s 之间进行线性插值:

@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
于 2014-07-10T23:03:25.540 回答
1

使用HSL 或 HSV而不是 RGB。它们具有从 0% 到 100% 的各种属性,因此您可以在代码中很好地缩放它们。

这是客观 c 参考

于 2010-01-26T20:40:43.473 回答
0

您需要将端点颜色转换为其中一个参数是强度的颜色空间,以便您可以保持此常数。@jvenema 的建议很不错。然后将其他两个值视为二维中的两个点,并根据滑块的位置沿着连接它们的线找到正确的点。将生成的颜色转换回 RGB 以进行显示。

你也可以试试 NSColor 的 blendedColorWithFraction:ofColor:,根据它的混合方式,它可能会做你想做的事。

于 2010-01-26T20:46:58.250 回答
0

用简单的线性插值来做。浮点数是为了精确。

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

我不是色彩专家,但这对我来说并不难看。

于 2010-01-26T20:48:30.923 回答