0

我还是 android 开发的新手,到目前为止我一直在处理的所有应用程序都与图形无关。现在我正在制作一个显示图表的应用程序,确切地说是饼图,并且我在没有任何 3rd 方库的情况下制作它。是我遵循的教程。

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

我从来没有处理过画布,知道如何做到这一点吗?示例代码将不胜感激。

谢谢

4

3 回答 3

2

在运行时很难获得不同且有用的颜色。最好的办法是不要使用太多的随机性,而是制作一个由 20 种固定颜色组成的数组,并使用 X 的第一个颜色作为您的数据。如果您需要更多,则可以使用随机 RGB 值使用真正的随机颜色:

Random r = new Random();
Color c = new Color( r.nextInt(255), r.nextInt(255), r.nextInt(255) );
于 2012-04-20T15:37:09.170 回答
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 种亮色。

于 2012-04-20T15:37:16.923 回答
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

这将确保鲜艳的色彩。

于 2012-04-20T15:39:05.487 回答