Fra*_*ice 4 java rgb swing gradient colors
很难描述我想要做的事情.我基本上想要创建一个离散的彩虹渐变,这样对于i个JButton的任何一行,它们之间的颜色渐变看起来都是彩虹.
我做了以下但是它只创建了一个红色渐变,然后是绿色渐变,然后是蓝色渐变:
Color[] c = new Color[i];
for(int n = 0; n < i; n++) {
if(n < i/3) {
c[n] = new Color(255, 255/(n+1), 255/(n+1));
} else if(n < 2*i/3) {
c[n] = new Color(255/(n-(i/3)), 255, 255/(n-(i/3)));
} else {
c[n] = new Color(255/(n+1), 255/(n+1), 255);
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法我怎么能得到某种类型的彩虹效果?
谢谢
编辑:
使用Sine函数似乎工作稍好,但不知道如何定义它所以我得到一个"彩虹波"在我想要的区域:
for(int n = 0; n < i; n++) {
c[n] = new Color((int)(Math.sin(n) * 127 + 128), (int)(Math.sin(n + Math.PI/2) * 127 + 128), (int)(Math.sin(n + Math.PI) * 127 + 128));
}
Run Code Online (Sandbox Code Playgroud)
Mar*_* A. 14
您的代码有正确的想法,但您需要以不同的方式运行您的颜色.
假设您从绿色开始:
Color( 0, 255, 0)
Run Code Online (Sandbox Code Playgroud)
慢慢开始添加一些红色以变黄:
Color( 51, 255, 0)
Color(102, 255, 0)
Color(153, 255, 0)
Color(204, 255, 0)
Color(255, 255, 0)
Run Code Online (Sandbox Code Playgroud)
然后,拿出绿色变红:
Color(255, 204, 0)
Color(255, 153, 0)
Color(255, 102, 0)
Color(255, 51, 0)
Color(255, 0, 0)
Run Code Online (Sandbox Code Playgroud)
现在,添加蓝色以获得紫色:
Color(255, 0, 51)
Color(255, 0, 102)
Color(255, 0, 153)
Color(255, 0, 204)
Color(255, 0, 255)
Run Code Online (Sandbox Code Playgroud)
然后,删除红色以获得蓝色:
Color(204, 0, 255)
Color(153, 0, 255)
Color(102, 0, 255)
Color( 51, 0, 255)
Color( 0, 0, 255)
Run Code Online (Sandbox Code Playgroud)
添加绿色以获得青色:
Color( 0, 51, 255)
Color( 0, 102, 255)
Color( 0, 153, 255)
Color( 0, 204, 255)
Color( 0, 255, 255)
Run Code Online (Sandbox Code Playgroud)
最后删除蓝色以恢复绿色:
Color( 0, 255, 204)
Color( 0, 255, 153)
Color( 0, 255, 102)
Color( 0, 255, 51)
Color( 0, 255, 0)
Run Code Online (Sandbox Code Playgroud)
当然,在这个圈子里,你可以从任何地方开始,向任何一个方向前进.
在代码中,它可能看起来像这样简单:
List<Color> colors = new ArrayList<Color>();
for (int r=0; r<100; r++) colors.add(new Color(r*255/100, 255, 0));
for (int g=100; g>0; g--) colors.add(new Color( 255, g*255/100, 0));
for (int b=0; b<100; b++) colors.add(new Color( 255, 0, b*255/100));
for (int r=100; r>0; r--) colors.add(new Color(r*255/100, 0, 255));
for (int g=0; g<100; g++) colors.add(new Color( 0, g*255/100, 255));
for (int b=100; b>0; b--) colors.add(new Color( 0, 255, b*255/100));
colors.add(new Color( 0, 255, 0));
Run Code Online (Sandbox Code Playgroud)
这里,100是每个淡入淡出的步数,您可以调整.
如果您需要数组中的颜色,请在最后执行此操作:
Color[] c = colors.toArray(new Color[colors.size()]);
Run Code Online (Sandbox Code Playgroud)
有一点需要注意:人眼对绿色比对红色和蓝色更敏感.因此,您可能希望使用比红色和蓝色更小的步骤添加和删除绿色.只需使用不同的步长,直到你得到看起来均匀的东西.
PS:对于我用过的,如上所述的线性衰落是完全足够的并且看起来像预期的那样.我个人认为你不需要使用sin和cos或其他数学来复杂化.
小智 11
您可以使用 HSV(色调、饱和度、值)代替 RGB。在 HSV 中,颜色范围仅受一个变量(色调)的影响。如果您从 0 到 360 运行,您将涵盖整个颜色范围。

代码示例:
final int ARRAY_SIZE = 100;
double jump = 360.0 / (ARRAY_SIZE*1.0);
int[] colors = new int[ARRAY_SIZE];
for (int i = 0; i < colors.length; i++) {
colors[i] = Color.HSVToColor(new float[]{(float) (jump*i), 1.0f, 1.0f});
}
Run Code Online (Sandbox Code Playgroud)
如果您只想覆盖颜色表的一部分(使用我在下面附上的图片)。红色的绿松石色数组示例:
final int ARRAY_SIZE = 100;
final int MAX_COLOR = 360;
final int MIN_COLOR = 160;
double jump = (MAX_COLOR-MIN_COLOR) / (ARRAY_SIZE*1.0);
int[] colors = new int[ARRAY_SIZE];
for (int i = 0; i < colors.length; i++) {
colors[i] = Color.HSVToColor(new float[]{(float) (MIN_COLOR + (jump*i)), 1.0f, 1.0f});
}
Run Code Online (Sandbox Code Playgroud)
