为了在GWT-Widget中表示具有不同颜色的对象列表,我们需要动态获取与对象颜色不同的颜色列表。由于列表的大小可能会有所不同,我们需要能够计算出这样的颜色列表。如何动态计算颜色列表?
5
A
回答
6
我的解决方案的另一个版本范围:
List<int> getUniqueColors(int amount) {
final int lowerLimit = 0x10;
final int upperLimit = 0xE0;
final int colorStep = (upperLimit-lowerLimit)/Math.pow(amount,1f/3);
final List<int> colors = new ArrayList<int>(amount);
for (int R = lowerLimit;R < upperLimit; R+=colorStep)
for (int G = lowerLimit;G < upperLimit; G+=colorStep)
for (int B = lowerLimit;B < upperLimit; B+=colorStep) {
if (colors.size() >= amount) { //The calculated step is not very precise, so this safeguard is appropriate
return colors;
} else {
int color = (R<<16)+(G<<8)+(B);
colors.add(color);
}
}
return colors;
}
这一个是更先进,因为它产生彼此不同尽可能的颜色(像@aiiobe一样)。
一般我们拆分至红,绿,蓝的3子范围,计算出我们如何许多步骤需要遍历每个人(通过应用POW(范围,1F/3))和迭代他们。
以数字3为例,它将生成0x0000B1, 0x00B100, 0x00B1B1
。对于数字10,它将是:0x000076, 0x0000EC, 0x007600, 0x007676, 0x0076EC, 0x00EC00, 0x00EC76, 0x00ECEC, 0x760000, 0x760076
5
这样的事情我会猜。没有随机性,只是计算要采取的颜色步骤,并将所有颜色范围拆分为该步骤。如果限制下限 - 您将删除太深的颜色,限制上限将消除太亮的颜色。
List<Integer> getUniqueColors(int amount) {
final int lowerLimit = 0x101010;
final int upperLimit = 0xE0E0E0;
final int colorStep = (upperLimit-lowerLimit)/amount;
final List<Integer> colors = new ArrayList<Integer>(amount);
for (int i=0;i<amount;i++) {
int color = lowerLimit+colorStep*i;
colors.add(color);
}
return colors;
}
5
如果我了解您的情况正确,您是否看到多种颜色,看起来有点“尽可能不同”?我会在这种情况下建议你改变色调值(两种红色的亮度略有不同),所以你得到像“彩虹调色板”:
这可以通过以下代码:
Color[] cols = new Color[n];
for (int i = 0; i < n; i++)
cols[i] = Color.getHSBColor((float) i/n, 1, 1);
一个例子使用具有低于屏幕截图:
import java.awt.*;
public class TestComponent extends JPanel {
int numCols = 6;
public void paint(Graphics g) {
float h = 0, dh = (float) getHeight()/numCols;
Color[] cols = getDifferentColors(numCols);
for (int i = 0; i < numCols; i++) {
g.setColor(cols[i]);
g.fillRect(0, (int) h, getWidth(), (int) (h += dh));
}
}
public static Color[] getDifferentColors(int n) {
Color[] cols = new Color[n];
for (int i = 0; i < n; i++)
cols[i] = Color.getHSBColor((float) i/n, 1, 1);
return cols;
}
public static void main(String s[]) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TestComponent());
f.setSize(200, 200);
f.setVisible(true);
}
}
numCols = 6
和numCols = 40
产生了followi NG两张截图:
如果你需要一个像超过30种颜色,当然你可以改变亮度或许饱和度为好,并且有,例如,10成深色,10种色调颜色,和10个鲜艳的色彩。
相关问题
- 1. 如何动态计算正确的RGB颜色与背景颜色对比?
- 2. 该算法如何计算rgb颜色?
- 3. 如何使用ColorMatrix计算颜色值?
- 4. 如何计算颜色阴影代码?
- 5. Spotfire如何沿一个颜色计算
- 6. 如何计算渐变颜色替换?
- 7. 如何计算RGB颜色中的颜色分量“数量”
- 8. 如何动态改变列表视图中的背景颜色
- 9. 如何动态设置SAPUI5表格列的背景颜色?
- 10. 如何在列表视图上动态设置rgb颜色?
- 11. 如何动态设置列表项目的boder颜色?
- 12. 如何用SASS创建动态颜色列表?
- 13. 动态计算SAS表中的列数
- 14. 沿梯度计算颜色
- 15. 计算颜色值关系
- 16. WebGL颜色混合计算
- 17. 颜色深度计算
- 18. NSColor RGB颜色计算
- 19. 的CSS - 计算灰颜色
- 20. 计算材质颜色
- 21. 如何根据C#中的一系列值计算颜色?
- 22. 如何自动计算导航项目背景颜色
- 23. Android动态计算列数
- 24. 动态dplyr列名计算
- 25. pyspark动态列计算
- 26. 计算具有相同背景颜色的单元格列表
- 27. 计算色彩图中的颜色
- 28. 如何在颜色状态列表资源中指定背景颜色?
- 29. jQuery动态表格计算
- 30. 如何动态改变笔画颜色?
如果你想跳过灰色 - 一些额外的计算将是必需的。你需要一些'if(r == g == b)然后在循环中继续',还需要'Math.pow(amount,1f/3)'来增加'amount'跳过灰色可能)。 – bezmax 2010-08-04 09:16:49
或者你可以坚持不同的色调;) – aioobe 2010-08-04 09:34:37
是的,但我不擅长HSV,所以我提出了第一件事情,我想到了。 – bezmax 2010-08-04 09:46:54