0

私はまだAndroid開発に慣れておらず、これまで扱ってきたすべてのアプリはグラフィックに関連していません。今、私はグラフを表示するアプリを作成しています。正確には円グラフであり、サードパーティのライブラリなしでこれを作成しています。これは私が従ったチュートリアルです。

ここで問題となるのは、グラフの作成に使用するデータが動的であるため、各アイテムにグラフの色を割り当てるには、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

完全にランダムな色だけを使うのではありません。あなたは完全に異なる彩度と明るさを得るでしょう、それは明らかに醜いように見えます。

彩度(鮮やかな色には高い値を選択)と明るさを修正し、ランダムな色相値を選択することもできますが、ほぼ同じ色の2つの連続したパイスライスを取得するリスクがあります。

この質問への回答に示されているように、一連の分散色相値を計算します。

以下の回答を再投稿する


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 に答える