如何为canvas.drawColor生成随机颜色的随机数

时间:2012-04-20 15:30:11

标签: java android android-canvas

我仍然是Android开发的新手,到目前为止我所处理的所有应用程序都不是图形相关的。现在我正在制作一个应用程序,显示图形,饼图是准确的,即时通讯,没有任何第三方库。 This是我遵循的教程。

现在问题是我将用于构建图形的数据是动态的,因此要为图形分配每个项目的颜色,我需要为canvas.drawColor生成许多随机颜色。颜色的数量当然取决于我在运行时确定的动态数据,并且还需要生成颜色值。 如果产生的颜色是鲜明的颜色,那就太好了。

我从未处理过画布,不知道如何做到这一点?示例代码将非常感激。

由于

3 个答案:

答案 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);
    }
}

enter image description here

如果您需要超过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

这将确保鲜艳的色彩。