您的代码想法是正确的,但需要稍微改变一下颜色的运行方式。
假设您从绿色开始:
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()])
需要注意的一点是:人眼对绿色比对红色和蓝色更加敏感。因此,您可能希望以比红色和蓝色小的步长添加和去除绿色。只需尝试不同的步长大小,直到得到看起来均匀的东西为止。
附言:就我所用过的情况而言,上述线性淡化效果已经足够,并且看起来符合预期。个人认为,您不需要通过使用正弦和余弦或其他数学方法来使事情变得复杂。
Color.getHSBColor
,可查看这里。 - trashgod