您的代码有正确的想法,但您需要稍微不同地运行您的颜色。
假设您从绿色开始:
Color( 0, 255, 0)
慢慢开始添加一些红色以变成黄色:
Color( 51, 255, 0)
Color(102, 255, 0)
Color(153, 255, 0)
Color(204, 255, 0)
Color(255, 255, 0)
然后,去掉绿色变成红色:
Color(255, 204, 0)
Color(255, 153, 0)
Color(255, 102, 0)
Color(255, 51, 0)
Color(255, 0, 0)
现在,添加蓝色变为紫色:
Color(255, 0, 51)
Color(255, 0, 102)
Color(255, 0, 153)
Color(255, 0, 204)
Color(255, 0, 255)
然后,删除红色以获得蓝色:
Color(204, 0, 255)
Color(153, 0, 255)
Color(102, 0, 255)
Color( 51, 0, 255)
Color( 0, 0, 255)
添加绿色回来得到青色:
Color( 0, 51, 255)
Color( 0, 102, 255)
Color( 0, 153, 255)
Color( 0, 204, 255)
Color( 0, 255, 255)
最后删除蓝色以恢复绿色:
Color( 0, 255, 204)
Color( 0, 255, 153)
Color( 0, 255, 102)
Color( 0, 255, 51)
Color( 0, 255, 0)
当然,在这个圈子里,你可以从任何地方开始,朝任何一个方向走。
在代码中,它可能看起来像这样简单:
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));
这里,100 是每个淡入淡出的步数,您可以调整。
如果您需要数组中的颜色,请在最后执行此操作:
Color[] c = colors.toArray(new Color[colors.size()]);
需要注意的一件事是:人眼对绿色比对红色和蓝色更敏感。因此,您可能希望以比红色和蓝色更小的步骤添加和删除绿色。只需尝试不同的步长,直到得到看起来均匀的东西。
PS:对于我使用它的用途来说,如上所述的线性淡入淡出已经足够了,并且看起来符合预期。我个人认为您不需要使用 sin 和 cos 或其他数学使事情复杂化。