我正在尝试创建一个仅使用一个滑块的颜色选择器。我知道这不会允许所有颜色,我将无法调整 alpha、色调和饱和度。那里有很多颜色选择器的例子。一种常见的颜色选择器涉及使用方形和线性光谱。正方形允许您更改色调和饱和度。我只想要线性光谱值。我很想用一些算法来做到这一点,但我想不出如何开始。最坏的情况是,我可以使用一个包含颜色的数组,只使用进度条的值作为索引。
问问题
919 次
2 回答
2
我想出了以下代码,它与我想做的事情相匹配。可以对其进行修改以提供更大范围的值。该代码非常粗糙,但我认为您明白了。
public int getColorFromProgress(int progress)
{
int color1 = 0, color2 = 0, color = 0;
float p = (float)progress;
if(progress <= 10) /* black to red */
{
color1 = 0;
color2 = 0xff0000;
p = progress / 10.0f;
}
else if(progress <= 25) /* red to yellow */
{
color1 = 0xff0000;
color2 = 0xffff00;
p = (progress - 10) / 15.0f;
}
else if(progress <= 40) /* yellow to lime green */
{
color1 = 0xffff00;
color2 = 0x00ff00;
p = (progress - 25) / 15.0f;
}
else if(progress <= 55) /* lime green to aqua */
{
color1 = 0x00ff00;
color2 = 0x00ffff;
p = (progress - 40) / 15.0f;
}
else if(progress <= 70) /* aqua to blue */
{
color1 = 0x00ffff;
color2 = 0x0000ff;
p = (progress - 55) / 15.0f;
}
else if(progress <= 90) /* blue to fuchsia */
{
color1 = 0x0000ff;
color2 = 0x00ff00;
p = (progress - 70) / 20.0f;
}
else if(progress <= 98) /* fuchsia to white */
{
color1 = 0x00ff00;
color2 = 0xff00ff;
p = (progress - 90) / 8.0f;
}
else
{
color1 = 0xffffff;
color2 = 0xffffff;
p = 1.0f;
}
int r1 = (color1 >> 16) & 0xff;
int r2 = (color2 >> 16) & 0xff;
int g1 = (color1 >> 8) & 0xff;
int g2 = (color2 >> 8) & 0xff;
int b1 = (color1) & 0xff;
int b2 = (color2) & 0xff;
int r3 = (int) ((r2 * p) + (r1 * (1.0f-p)));
int g3 = (int) (g2 * p + g1 * (1.0f-p));
int b3 = (int) (b2 * p + b1 * (1.0f-p));
color = r3 << 16 | g3 << 8 | b3;
return color;
}
于 2013-02-10T07:43:58.717 回答
0
我不确定,但我认为你可以这样想。
要用一个值表示所有颜色,蓝色需要 1 个字节,红色需要 1 个字节,绿色需要 1 个字节。
所以你可以这样做。
让滑块为 0 到 0xFFFFFF
然后通过以下方式过滤掉值:
#include <stdio.h>
int main()
{
int color = 0x0aFF0b;
int r = ((0xff << 4) & color) >> 4;
int g = ((0xff << 2) & color) >> 2;
int b = ((0xff) & color);
printf("r: %x\n", r);
printf("r: %x\n", g);
printf("r: %x\n", b);
return 0;
}
然后只需将这些值插入颜色中,然后使用它。
于 2013-02-10T05:23:35.820 回答