java.awt.Colorクラスのメソッドにbrighter(この色をより明るくした色を得る)とdarker(この色をより暗くした色を得る)があります。これを使えば徐々に変化する色を得られると思って、runメソッドを次の様に書いて試してみました。
public void run() {
newColor = Color.blue;
for(int i=0; i<6; i++) {
// blueを5回明るくする
newColor = newColor.brighter();
}
while(true) {
repaint();
// repaintはupdateを呼び、updateはpaintを呼ぶ
try {
// スレッドの一時停止時間
Thread.sleep(500);
} catch (InterruptedException e){ }
newColor = newColor.darker(); // 1段暗い色を作る
}
}
まず基本の色(ここではColor.blue)をセットし、それをbrighterメソッドで5回明るくします。それで画面を塗りつぶしてから、一時停止して、1段暗い色を作り繰り返します。このままだと、どこまでも暗い色が作られ続けますがテストですからかまいません。Test202アプレット表示 画面が黒かったら更新ボタンを押してください ソース・ダウンロードTest202.java |
少しちらつきますが、まあまあでしょうか。色を変えたり、明るくする回数を加減してテストしてみると変化しない色があります。java.awt.Colorクラスのソースからbrighterメソッドを見てみると次の様になっていました。
private static final double FACTOR = 0.7;
public Color brighter() {
return new Color(Math.min((int)(getRed() *(1/FACTOR)), 255),
Math.min((int)(getGreen()*(1/FACTOR)), 255),
Math.min((int)(getBlue() *(1/FACTOR)), 255));
}
元の色ののRGBの数値(0から255までの値)を取り出して、それに約1.4を掛けています。その数値が255を超えないように、出た数値と255を比べて小さい方を取っています。RGBの数値が全て0か255の場合には色が変化しません。例を上げると(0, 0, 255)のblueだと、これ以上明るい色は作られません。これでは困るので1.4を掛けてるところを足し算にした物を作ります。
|
本当は別のクラスを作って、そのクラスをjava.awt.Colorクラスのサブクラスにして、brighterメソッドをオーバーライドするのが正しいと思いますが、今回は現在のクラスに違う名前のメソッドを作りました。同じ名前でも問題無いのかも知れませんが一応名前を変えて次の様にしました。
// 明るい色を作る(コアAPI brighter()ソースの修正)
public Color bright(Color c) {
double b=15;
return new Color(Math.min((int)(c.getRed()+b), 255),
Math.min((int)(c.getGreen()+b), 255),
Math.min((int)(c.getBlue()+b), 255));
}
// 暗い色を作る(コアAPI darker()ソースからの修正)
public Color dark(Color c) {
double b=15;
return new Color(Math.max((int)(c.getRed()-b), 0),
Math.max((int)(c.getGreen()-b), 0),
Math.max((int)(c.getBlue()-b), 0));
}
brighterからbrightを、darkerからdarkを作りました。Colorクラスのメソッドでは無くなったので呼び出すときに基本の色を引数にして与えるように変更しました。brighterで色の変わらない(0, 0, 255)のblueをbrightに1回かけると、(15, 15, 255)になります。Test203アプレット表示 画面が黒かったら更新ボタンを押してください ソース・ダウンロードTest203.java |
|
前のと比べて明るい青から表示されました。少しちらつきますが、先にプログラムを完成させます。色々な色で確認したいのでランダムに色をセットするようにしましょう。そして、ある程度暗くなったら次の色に変っていくようにしましょう。 乱数を作るには何を使うのか、数学関係はjava.mathパッケージにあるかと思って見てみたら違いました。java.lang.Mathに数学関係のメソッドがあります。randomメソッドの説明にが0.0 and 1.0までの範囲の乱数値を返すとあります。基本の何色かを配列にセットしておいて、そこから乱数で色を呼び出す事にします。余談になりますが乱数の発生はjava.util.Randomを使っても出来るようです。 Colorの配列は、Color col[] = new Color[8];の様に宣言します。配列の要素の添字は0から始まります。配列を宣言と同時に初期化する場合は以下の様になります。配列colに8色をセットしていますから、0から7の乱数が必要です。randomで発生した0.0から1.0の乱数に8を掛けて、少数部分を切り捨ててしまえば0から7の乱数になります。変更したrunメソッドもいっしょに示します。
Color col[]={ Color.blue, Color.cyan, Color.green, Color.yellow,
Color.orange, Color.pink, Color.red, Color.magenta };
public void run() {
while(true) {
// ランダムに色をセット
int z = (int) (Math.random()*8); // z に色No.をセット
newColor = col[z]; // 色をセット
// 5回明るくする
for(int i=0; i<6; i++) {
newColor = newColor.brighter();
}
for (int n=0; n<10; n++) {
repaint();
// repaintはupdateを呼び、updateはpaintを呼ぶ
try {
// スレッドの一時停止時間
Thread.sleep(500);
} catch (InterruptedException e){ }
newColor = newColor.darker(); // 1段暗い色を作る
}
}
}
アプレットを示します。Test204アプレット表示 ソース・ダウンロードTest204.java |