2012-04-20 3 views
0

Я все еще новичок в разработке Android и все приложения, с которыми я имел дело до сих пор, не связаны графически. Теперь я создаю приложение, которое отображает график, график пирога, и, делая это, без каких-либо сторонних библиотек. This - это учебник, в котором я последовал.как генерировать случайные числа случайных цветов для canvas.drawColor

Теперь проблема заключается в том, что данные, которые я буду использовать для построения графика, являются динамическими, и поэтому для назначения каждого элемента с цветом для графика мне нужно создать ряд случайных цветов для canvas.drawColor. количество цветов, конечно, будет зависеть от моих динамических данных, которые определяются во время выполнения, и значение цвета также необходимо сгенерировать. Также было бы неплохо, если бы цвета были яркими цветами, которые выделяются.

Я никогда не имел дело с холстом, любая идея, как это можно сделать? Пример кода будет высоко оценен.

Благодаря

+0

На самом деле нет вопроса.Я уверен, что есть много учебников, с тоннами кода примера, там, где вы можете посмотреть на андроид-холст. http://mattgemmell.com/2008/12/08/what-have-you-tried/ – aglassman

ответ

1

Было бы довольно трудно получить различные и ПОЛЕЗНЫЕ цвета во время выполнения. Лучше всего не использовать так много случайности, но сделайте массив, допустим, 20 фиксированных цветов, совершенно разных, и используйте первые X для ваших данных. Если вам нужно больше, то, возможно, используйте реальные случайные цвета, используя случайные значения RGB:

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

На самом деле сейчас вы упомянули об этом, можно ли создать 5 цветов и пропустить их с моими данными, просто убедившись, что нет одинаковых цветов подряд? – ariken929

+1

Случайные цвета легко сгенерированы. Сделать их хорошо выглядеть сложно. Я согласен с тем, что вам будет лучше создавать множество красивейших цветов, 20-50 из них, а затем случайным образом выбирать из них. – aglassman

+2

Разве вы не используете r.nextInt (256)? Так как его верхний предел? – user717572

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. в учебном пособии im используются следующие цвета int [] = {- 6777216, -16776961, -16711681, -12303292, -7829368}; можете ли вы сказать мне, что это за значение? – ariken929

+0

Похоже, что такие коды rgb, как 'http: // www.ceveni.com/2009/08/set-rgb-color-codes-for-android-and-rgb.html', вы можете преобразовать их с помощью java. Если бы я был вами, я бы использовал отдельные компоненты жестко. Вы также можете определить цвета в диапазоне 0-255, если хотите. – user717572

Смежные вопросы