2012-04-20 56 views
0

我还是一个新的android开发,迄今为止我所处理的所有应用程序都不是图形相关的。现在我正在制作一个显示图形,饼图的应用程序,并且可以在没有任何第三方库的情况下进行此操作。 This是我遵循的教程。如何随机生成随机数的canvas.drawColor

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

我从来没有处理画布,任何想法如何做到这一点?代码示例将非常感谢。

感谢

+0

有没有真正的问题。我确定有很多教程,有大量的示例代码,使用可以看到的Android画布。 http://mattgemmell.com/2008/12/08/what-have-you-tried/ – aglassman 2012-04-20 16:03:45

回答

1

这将是十分困难在运行时获得不同的和有用的颜色。最好不要使用这么多的随机性,而是让我们说20个固定的颜色非常不同,并使用X为您的数据的第一个。如果您需要更多,则可能使用随机RGB值的真实随机颜色:

Random r = new Random(); 
Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)); 
+0

其实现在我们已经提到过了,是否可以创建5种颜色并通过数据循环来确保数据的正确性有没有相同的连续颜色? – ariken929 2012-04-20 15:55:17

+1

随机颜色很容易产生。让它们看起来很好很难。我同意你最好制作一组漂亮的颜色,其中20-50个,然后从这些颜色中随机选择。 – aglassman 2012-04-20 16:01:15

+2

不应该使用r.nextInt(256)?既然它的上限? – user717572 2012-04-20 16:03:18

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个亮色。

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 

这将确保鲜艳的色彩。

+0

啊好吧,所以这使用rgb值。下面的教程使用int colors [] = { - 6777216,-16776961,-16711681,-12303292,-7829368};你能告诉我这是什么类型的价值吗? – ariken929 2012-04-20 15:48:49

+0

它看起来像'http:// www.ceveni.com/2009/08/set-rgb-color-codes-for-android-and-rgb.html'这样的rgb代码,你可以用java转换它们。如果我是你,我会使用单独的组件。如果你喜欢,你也可以在0-255范围内定义颜色。 – user717572 2012-04-20 16:02:18