我正在尝试按彩虹顺序循环所有 RGB 颜色。目前我有这个:
int state = 1;
int a = 255;
int r = 255;
int g = 0;
int b = 0;
if(g < 255 && state == 1){
g++;
r--;
if(g == 255)
state = 2;
}
if(b < 255 && state == 2){
b++;
g--;
if(b == 255)
state = 3;
}
if(state == 3){
r++;
b--;
if(b == 0)
state = 1;
}
int hex = (a << 24) + (r << 16) + (g << 8) + (b);
它可以工作,但似乎没有获得所有颜色。我知道这可能是一个不好的方法,是的,我知道我可以在彼此内部做 3 个循环,但是有人知道更好的方法来获得所有颜色吗?
另外,我不使用 3 个循环的原因是因为它需要在每个新的 RGB 组合之后更新,而不是在循环完成之后更新,因为这每次都会给我相同的结果。
编辑: 感谢 pbabcdefp 我让它工作了,解决方案如下。
int state = 0;
int a = 255;
int r = 255;
int g = 0;
int b = 0;
if(state == 0){
g++;
if(g == 255)
state = 1;
}
if(state == 1){
r--;
if(r == 0)
state = 2;
}
if(state == 2){
b++;
if(b == 255)
state = 3;
}
if(state == 3){
g--;
if(g == 0)
state = 4;
}
if(state == 4){
r++;
if(r == 255)
state = 5;
}
if(state == 5){
b--;
if(b == 0)
state = 0;
}
int hex = (a << 24) + (r << 16) + (g << 8) + (b);
您需要找到所有组合。您的代码的问题在于,在一个循环中您修改了两个值。在这种情况下,您会跳过一种颜色。例如,您有 G=100 和 R=100:
g++; r--; 在此行之后,G 将是 101,R 将是 99。下次将是 G102,R98 您现在获得了三种组合:
[g100,r100],g[101,r99],g[102,r98]。
但是你在这里错过了很多其他组合,例如 [g100,r99] 和 g[101,r100] 或 g[101,r98] 等。
您可以创建一个
RGB
类来保存 ARGB 值,并创建一个方法将该值增加 1。
考虑下面的课程。
class RGB {
int alpha, red, green, blue;
void next() {
if (blue != 255) blue++;
else if (green != 255) green++;
else if (red != 255) red++;
else if (alpha != 255) alpha++;
else throw new IndexOutOfBoundsException();
}
@Override
public String toString() {
return "%02x%02x%02x%02x".formatted(alpha, red, green, blue);
}
}
输出示例
00000001
00000002
00000003
00000004
00000005
...
fbffffff
fcffffff
fdffffff
feffffff
ffffffff