我仍然是Android开发的新手,到目前为止我所处理的所有应用程序都不是图形相关的。现在我正在制作一个应用程序,显示图形,饼图是准确的,即时通讯,没有任何第三方库。 This是我遵循的教程。
现在问题是我将用于构建图形的数据是动态的,因此要为图形分配每个项目的颜色,我需要为canvas.drawColor生成许多随机颜色。颜色的数量当然取决于我在运行时确定的动态数据,并且还需要生成颜色值。 如果产生的颜色是鲜明的颜色,那就太好了。
我从未处理过画布,不知道如何做到这一点?示例代码将非常感激。
由于
答案 0 :(得分:1)
在运行时获取不同且有用的颜色将非常困难。最好的不是使用这么多的随机性,而是制作一个数组,让我们说20种固定颜色非常不同,并使用X首先为您的数据。如果您需要更多,那么可以使用随机RGB值使用真正的随机颜色:
Random r = new Random();
Color c = new Color( r.nextInt(255), r.nextInt(255), r.nextInt(255) );
答案 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(400, 400);
f.setVisible(true);
}
}
如果您需要超过30种颜色,您当然可以改变亮度和饱和度,例如,有10种深色,10种中间色和10种鲜艳色。
答案 2 :(得分:1)
您应该为每个颜色分量采用随机浮点数:
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
由于您需要鲜艳的色彩,因此可以使用Color.brighter()
方法。
Color c = new Color(r, g, b);
c = c.brighter();
否则您可以设置一个阈值,以便颜色值具有最小值(更高更亮):
float minimumBrightness = 0.6; //higher is more vibrant
float r = rand.nextFloat(1-minimumBrightness) + minimumBrightness; //for each component
这将确保鲜艳的色彩。